[FFmpeg-devel] [PATCH] [2/??] [3/3] Filter graphs - Parser for a graph description
Michael Niedermayer
michaelni
Wed Mar 19 21:19:16 CET 2008
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
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
It is not what we do, but why we do it that matters.
-------------- 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/20080319/477341cc/attachment.pgp>
More information about the ffmpeg-devel
mailing list