[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