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

Vitor Sessak vitor1001
Sun Mar 30 13:50:51 CEST 2008


Hi

Michael Niedermayer wrote:
> On Wed, Mar 19, 2008 at 08:03:54PM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Tue, Mar 18, 2008 at 09:04:18PM +0100, Vitor Sessak wrote:
>>>> Hi
>>>>
>>>> Michael Niedermayer wrote:
>>>>> On Mon, Mar 17, 2008 at 08:12:08PM +0100, Vitor Sessak wrote:
>>>>>> Hi
>>>>>>
>>>>>> Michael Niedermayer wrote:
>>>>> [...]
>>>>>> /**
>>>>>>  * For use in av_log
>>>>>>  */
>>>>>> static const char *log_name(void *p)
>>>>>> {
>>>>>>     return "Filter parser";
>>>>>> }
>>>>>>
>>>>>> static const AVClass filter_parser_class = {
>>>>>>     "Filter parser",
>>>>>>     log_name
>>>>>> };
>>>>>>
>>>>>> static const AVClass *log_ctx = &filter_parser_class;
>>>>> I was more thinking of passing a context as argument into the parser.
>>>> Well, for example ffmpeg.c, which context will it pass to the parser? But 
>>>> maybe a good idea would be passing a context and, if NULL is passed, using 
>>>> log_ctx...
>>> hmm, well, leave log_ctx for now this is pretty much irrelevant we dont really
>>> need a user supplied ctx it was just an idea ...
>>>
>>>
>>>>>> static void consume_whitespace(const char **buf)
>>>>>> {
>>>>>>     *buf += strspn(*buf, " \n\t");
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>>  * get the next non-whitespace char
>>>>>>  */
>>>>>> static char consume_char(const char **buf)
>>>>>> {
>>>>>>     char out;
>>>>>>     consume_whitespace(buf);
>>>>>>
>>>>>>     out = **buf;
>>>>>>
>>>>>>     if (out)
>>>>>>         (*buf)++;
>>>>>>
>>>>>>     return out;
>>>>>> }
>>>>> is there some place which needs the extra-complex checks? or would:
>>>>> consume_whitespace(buf);
>>>>> return *(*buf)++;
>>>>> work as well ?
>>>> The idea is to have a safe parser. That way, you can call consume_char as 
>>>> much as you like, it'll never go past the end of the string and 
>>>> consume_string will never return NULL (but maybe an empty string).
>>> In which case of consume_char() use can the removed check cause it
>>> to go over the end of the buffer without a goto fail or similar first?
>> Well, it always will have a goto fail, but sometimes in "fail:" the 
>> function just returns an empty string and then the code flux continues, 
> 
> Does that mean the parser silently accepts invalid nonsense? This is not
> good.
> 
> 
>> and can try to consume one more char. One option would be making every 
>> function that uses have a return value to say if it failed or not (which 
>> would need to be checked). In my opinion it'll result in more complex code.
>>
>>>
>>>>>> /**
>>>>>>  * remove the quotation marks from a string. Ex: "aaa'bb'cc" -> "aaabbcc"
>>>>>>  */
>>>>>> static void unquote(char *str)
>>>>>> {
>>>>>>     char *p1, *p2;
>>>>>>     p1=p2=str;
>>>>>>     while (p1[0] != 0) {
>>>>>>         if (p1[0] == '\'') p1++;
>>>>>>         p2[0] = p1[0];
>>>>>>         p1++;
>>>>>>         p2++;
>>>>>>     }
>>>>>>
>>>>>>     p2[0] = 0;
>>>>>> }
>>>>> How do we support
>>>>> drawtext=various special chars:$%&'"=\
>>>>> ?
>>>> $ ffmpeg -i in.avi -vfilters "drawtext='various special chars:$%&\"=\\'" 
>>>> out.avi
>>>>
>>>> But there are two things that is complicated: the "'" char that can't be 
>>>> escaped by now (and it's the only one) 
>>> yes, thats why i brought it up ...
>> If you think it is important, I can try to implement a "\" escape for 
>> those cases. Or it can just be added when someone sees that it is needed.
> 
> its just
> 
> do{
>     int c= *in++;
>     if(c == '\\')
>         *out++= *in++;
>     else if(c== '\''){
>         while(*in && *in != '\'')
>             *out++= *in++;
>         if(*in) in++;
>     }else
>         *out++= c;
> }while(out[-1]);
> 
> 
> 
> 
>>>> and the ":" (that is not an especial 
>>>> character to this parser, but is parsed independently by each filter).
>>>>
>>>> Maybe parsing the different args in the parser and instead of passing to 
>>>> the filter something like
>>>>
>>>> static int init(AVFilterContext *ctx, const char *args, void *opaque)
>>>>
>>>> passing instead
>>>>
>>>> static int init(AVFilterContext *ctx, int argc, const char **argv, void 
>>>> *opaque)
>>>>
>>>> ?
>>> no, IMHO just pass the single string, its very easy for the filter to feed
>>> this to sscanf()
>> Unless in this case:
>>
>> (in) drawtext='special char!@:#!':arial:12 (out)
>>
>> (*args will have "special char!@:#!:arial:12")
> 
> put the string to print last and theres no problem with special chars

Next version attached. I hope I didn't forgot any comment.

-Vitor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: avfiltergraph.c
Type: text/x-csrc
Size: 14183 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080330/f5a69b00/attachment.c>



More information about the ffmpeg-devel mailing list