[FFmpeg-devel] [PATCH] [2/??] [3/3] Filter graphs - Parser for a graph description

Vitor Sessak vitor1001
Mon Feb 25 18:36:40 CET 2008


Hi

Michael Niedermayer wrote:
> On Sun, Feb 24, 2008 at 09:21:39PM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Sat, Feb 16, 2008 at 12:45:12PM +0100, Vitor Sessak wrote:
>>>> See $subj.
>>>>
>>>> /*
>>>>  * filter graph descriptions
>>>>  * copyright (c) 2007 Bobby Bingham
>>> [...]
>>>> #include <ctype.h>
>>>> #include <string.h>
>>>>
>>>> #include "avfilter.h"
>>>> #include "avfiltergraph.h"
>>>>
>>>> #define LINESIZE    240             ///< maximum length of an input line
>>>>
>>>> /** a comment is a line which is empty, or starts with whitespace, ';' or '#' */
>>>> static inline int is_line_comment(char *line)
>>>> {
>>>>     return line[0] == 0     ||
>>>>            isspace(line[0]) ||
>>>>            line[0] == ';'   ||
>>>>            line[0] == '#';
>>>> }
>>> A filter graph description should at least treat all whitespace outside
>>> quotes equal that is '\n' == ' ' == '  '
>>> Also it should be terse and it should be useable on the command line, that is
>>> avoid characters which needs complicated escaping to pass the shell.
>>>
>>> Heres a possible example, this is just a idea after 5min thinking and might
>>> not be the best ...
>>> [in]scale=400:300,crop=200:100,[+tmp]picInPic=50:50,rotate=1,split[+out],delay=50[tmp]
>>>
>>> would result in a filter graph like:
>>>
>>> in --> scale --> crop --> picInPic --> rotate --> split --> out
>>>                              ^                      |
>>>                              |                      |
>>>                            delay<-------------------/
>> This doesn't looks to would work well with
>>
>>   in --> crop --> picInPic --> rotate --> split --> vflip --> out
>>                      ^                      |
>>                      |                      |
>>                    delay<---- hflip --------/
>>
>>
>> Maybe something like
>>
>> (in)crop=400:300,(tmp1)picInPic=50:50,rotate=1,split(tmp2),vflip(out); 
>> (tmp2)hflip,delay(tmp1)
> 
> with the system i suggested it would be:
> (in)crop=400:300,(+tmp1)picInPic=50:50,rotate=1,split(+tmp2),vflip(out),(tmp2)hflip,delay(tmp1)

Ok, I understand, but I think the syntax with the ; is easier to learn.

>> And for
>>
>>   in --> crop --> rotate --> vflip --> out
>>
>> crop=400:300,rotate=1,vflip,split
> 
> yes (in) (out) should be default at the ends
> 
> 
>> meaning that when there is no semicolon, the (in) in the beginning and 
>> the (out) in the end can be omitted. 
> 
>> Also, I don't understand the point 
>> of explicitly putting a "+" in new vertexes...
> 
> filter1(abc),(def)filter2
> 
> filter1->(abc)
> (def)->filter2
> 
> filter1(+abc),(+def)filter2
> 
> filter1->filter2
>   |         ^
>   v         |
> (abc)     (def)
> 
> again, this was all just an idea ...
> your ';' achives the same, though it adds an additional char to the ones
> needing escaping if used in filters. Iam not even sure if we shoud use ',' as
> filter seperator ...
> '|' would be an alternative but it would need filter chains to be under ""
> though that applies to ; () [] as well

I prefer the comma. I like the syntax

ffmpeg -i in.avi -vfilters vflip,scale=300:400 out.avi

so as for filter graphs that are just a chain we have a simple, 
unescaped command line. If for more complex graphs "" are needed, it 
bother me less.

> other random ideas ...
> 
> crop=400:300|[tmp1]picInPic=50:50|rotate=1|split[tmp2]|vflip[out];[tmp2]hflip|delay[tmp1]
> 
> crop=400:300 | [tmp1]picInPic=50:50 | rotate=1 | split[tmp2] | vflip[out] ; [tmp2]hflip | delay[tmp1]
> 
> crop=400:300 | [tmp1] picInPic=50:50 | rotate=1 | split [tmp2] | vflip [out] ; [tmp2] hflip | delay [tmp1]

Wouldn't it be a good idea to ignore whitespace and newlines completely?

> 
> crop=400:300 | [tmp1] picInPic=50:50 | rotate=1 | split {hflip | delay[tmp1];} | vflip
> 
> 
> 
>> Finally, I prefer parenthesis instead of brackets... What do you think?
> 
> Passing eval.c equation like sin(5)*eq(a,b) might get trickier escaping
> wise and parsing wise with (), besides this iam fine with () as well, that
> is if you provide a solution to passing equations to eval based filters
> without requireing each () to be escaped individually.

I agree. But I'll have to add quotes to the syntax anyway for thing like

vflip,drawtext='text, a   =)   :-]':arial:10:10,hflip

-Vitor




More information about the ffmpeg-devel mailing list