1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avfilter/graphparser: allow specifying filter@id as filter instance

See http://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-April/035975.html
Parsed_filter_X could remain and user can override it with custom one.

Example:
ffplay -f lavfi "nullsrc=s=640x360,
sendcmd='1 drawtext@top reinit text=Hello; 2 drawtext@bottom reinit text=World',
drawtext@top=x=16:y=16:fontsize=20:fontcolor=Red:text='',
drawtext@bottom=x=16:y=340:fontsize=16:fontcolor=Blue:text=''"

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Muhammad Faiz <mfcc64@gmail.com>
This commit is contained in:
Muhammad Faiz 2017-05-17 13:03:28 +07:00
parent 3fb104f447
commit 162414cefe
2 changed files with 31 additions and 8 deletions

View File

@ -130,11 +130,11 @@ filterchains is represented by a list of ";"-separated filterchain
descriptions.
A filter is represented by a string of the form:
[@var{in_link_1}]...[@var{in_link_N}]@var{filter_name}=@var{arguments}[@var{out_link_1}]...[@var{out_link_M}]
[@var{in_link_1}]...[@var{in_link_N}]@var{filter_name}@@@var{id}=@var{arguments}[@var{out_link_1}]...[@var{out_link_M}]
@var{filter_name} is the name of the filter class of which the
described filter is an instance of, and has to be the name of one of
the filter classes registered in the program.
the filter classes registered in the program optionally followed by "@@@var{id}".
The name of the filter class is optionally followed by a string
"=@var{arguments}".
@ -212,10 +212,11 @@ to the filtergraph description.
Here is a BNF description of the filtergraph syntax:
@example
@var{NAME} ::= sequence of alphanumeric characters and '_'
@var{FILTER_NAME} ::= @var{NAME}["@@"@var{NAME}]
@var{LINKLABEL} ::= "[" @var{NAME} "]"
@var{LINKLABELS} ::= @var{LINKLABEL} [@var{LINKLABELS}]
@var{FILTER_ARGUMENTS} ::= sequence of chars (possibly quoted)
@var{FILTER} ::= [@var{LINKLABELS}] @var{NAME} ["=" @var{FILTER_ARGUMENTS}] [@var{LINKLABELS}]
@var{FILTER} ::= [@var{LINKLABELS}] @var{FILTER_NAME} ["=" @var{FILTER_ARGUMENTS}] [@var{LINKLABELS}]
@var{FILTERCHAIN} ::= @var{FILTER} [,@var{FILTERCHAIN}]
@var{FILTERGRAPH} ::= [sws_flags=@var{flags};] @var{FILTERCHAIN} [;@var{FILTERGRAPH}]
@end example
@ -17246,6 +17247,12 @@ Specify audio tempo change at second 4:
asendcmd=c='4.0 atempo tempo 1.5',atempo
@end example
@item
Target a specific filter instance:
@example
asendcmd=c='4.0 atempo@@my tempo 1.5',atempo@@my
@end example
@item
Specify a list of drawtext and hue commands in a file.
@example

View File

@ -88,20 +88,36 @@ static char *parse_link_name(const char **buf, void *log_ctx)
* @param filt_ctx put here a filter context in case of successful creation and configuration, NULL otherwise.
* @param ctx the filtergraph context
* @param index an index which is supposed to be unique for each filter instance added to the filtergraph
* @param filt_name the name of the filter to create
* @param name the name of the filter to create, can be filter name or filter_name\@id as instance name
* @param args the arguments provided to the filter during its initialization
* @param log_ctx the log context to use
* @return >= 0 in case of success, a negative AVERROR code otherwise
*/
static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int index,
const char *filt_name, const char *args, void *log_ctx)
const char *name, const char *args, void *log_ctx)
{
AVFilter *filt;
char inst_name[30];
char name2[30];
const char *inst_name = NULL, *filt_name = NULL;
char *tmp_args = NULL;
int ret;
int ret, k;
snprintf(inst_name, sizeof(inst_name), "Parsed_%s_%d", filt_name, index);
av_strlcpy(name2, name, sizeof(name2));
for (k = 0; name2[k]; k++) {
if (name2[k] == '@' && name[k+1]) {
name2[k] = 0;
inst_name = name;
filt_name = name2;
break;
}
}
if (!inst_name) {
snprintf(name2, sizeof(name2), "Parsed_%s_%d", name, index);
inst_name = name2;
filt_name = name;
}
filt = avfilter_get_by_name(filt_name);