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

Michael Niedermayer michaelni
Sun Mar 16 16:46:15 CET 2008


On Sat, Mar 15, 2008 at 09:29:03PM +0100, Vitor Sessak wrote:
> Hi
>
> Michael Niedermayer wrote:
>> On Mon, Feb 25, 2008 at 06:36:40PM +0100, Vitor Sessak wrote:
>> [...]
>>>>> 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?
>> That was the idea, sorry ive just been testing how different whitespace
>> placements would look ...
>>>> 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
>> well mplayer survivied without proper quote handling, and that results in
>> eval stuff looking really nasty ...
>
> Well, this is more of a RFC than a patch, since parsers are not my strong 
> point. The file was rewritten almost from scratch. Now the it accepts 
> things like
>
>  (  in  )   split(i1),fifo,(i2)overlay=0:240(out);(i1)vflip(i2)
>
> or
>
> vflip,scale=10:30


[...]

> typedef struct Parser
> {
>     char next_chr;
>     char *buf;
> } Parser;

Could you explain what this next_chr thing is good for?
Iam no string parser expert but my gut feeling says char *buf would be enough
and if so we could avoid the struct.


> 
> static void consume_whitespace(Parser *p)
> {
>     while (p->next_chr == ' ' || p->next_chr == '\n' || p->next_chr == '\t')
>         p->next_chr = *(++p->buf);
> }

id replace all consume_whitespace() by
ptr += strspn(ptr, " \n\t");


[...]


> 
> static char *consume_string(Parser *p, int escaped)
> {

What does the "escaped" do? Document or remove it please!


[...]
> static int parse_link_name(Parser *p, char **name)
> {
>     if (consume_char(p) != '(')
>         goto fail;
> 
>     *name = consume_string(p,0);
> 
>     if (!*name[0])
>         goto fail;
> 
>     if (consume_char(p) != ')')
>         goto fail;
> 
>     return 0;
> 
>  fail:
>     *name = NULL;
>     return AVERROR_INVALIDDATA;
> }

We need some clear error messages for the various failures. Not only here
of course ...


[...]
>     single_chain = (strchr(filters, '(') == NULL);

why the special case?


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

There will always be a question for which you do not know the correct awnser.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080316/899a7a0d/attachment.pgp>



More information about the ffmpeg-devel mailing list