[FFmpeg-devel] [PATCH] [2/??] [3/3] Filter graphs - Parser	for a graph description
    Vitor Sessak 
    vitor1001
       
    Sun Mar 16 19:57:29 CET 2008
    
    
  
Hi
Michael Niedermayer wrote:
> On Sun, Mar 16, 2008 at 05:09:37PM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> 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:
>>>> 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.
>> buf =  'test,blah\0'
>>
>> To read the 'test' part in consume_string() without any memcpy, I put a 
>> \0 after 'test' in the buffer and return a pointer to the start of the 
>> string. But to do that, I have to overwrite the comma. So I put the 
>> comma in the next_chr var.
> 
> i do not like this design
Ok, changed.
>>>
>>>> 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");
>> Looks a good idea, I'll look into it.
>>
> 
>>>
>>> [...]
>>>
>>>
>>>> static char *consume_string(Parser *p, int escaped)
>>>> {
>>> What does the "escaped" do? Document or remove it please!
>> buf = "'bbb;ccc)ddd'"
>>
>> consume_string(p, 1) == "bbb;ccc)ddd"
>> consume_string(p, 0) == "'bbb"
> 
> But why do we need the =0 case?
My idea was to use it for anything other than the filter parameters 
(there is something wrong if the filter/link name is escaped). But maybe 
it don't justify the additional complexity.
> 
>>> [...]
>>>> 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 ...
>> What should I do? av_log(NULL, AV_LOG_ERROR, "...")? Is in those cases 
> 
> maybe
> 
> 
>> ok to have no context?
> 
> no
> 
> 
> 
>>>
>>> [...]
>>>>     single_chain = (strchr(filters, '(') == NULL);
>>> why the special case?
>> To make
>>
>> (in) vflip, hflip (out)
>>
>> the same as
>>
>> flip, hflip
>>
>> without erroneously adding a '(in)' in the beginning of the following:
>>
>> movie_src=test.avi, vflip, (in)overlay(out)
>>
>> The syntax is that adding explicitly '(in)' and '(out)' is mandated for 
>> anything more complicated than a single chain.
> 
> what about:
> ()movie_src=test.avi, vflip, (in)overlay
> 
> () would override the default ...
> 
> or test for the occurance of (in) / (out) and add them at the begin/end only
> if they dont occur anywhere. 
I like this idea. It allows for things like
(tmp)overlay,vflip,split(tmp)
as an alias to
(in)(tmp)overlay,vflip,split(tmp)(out)
The only problem would be searching for (in), from all the possible cases:
(    in   )vflip(out)
(
   in   )vflip(out)
(in) vflip(out)
drawtext='text in pic'
are you ok with the extra complexity it'll add? And I cannot test for it 
during parsing, since I have to set the input pad indexes for the first 
filter, ie, in
(tmp)overlay,vflip,split(tmp)
I have to set
link.name="tmp";
link.type=input;
link.pad = 1; // And not 0, since in pad 0 there is the input!
and to know (tmp) is in the second pad, I have to know beforehand that 
there is no (in) in the chain...
-Vitor
    
    
More information about the ffmpeg-devel
mailing list