[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