[FFmpeg-devel] [PATCH] vf_drawtext: make x and y options parametric

Stefano Sabatini stefasab at gmail.com
Wed Sep 21 10:33:18 CEST 2011


On date Tuesday 2011-09-20 23:49:18 +0200, Víctor Paesa encoded:
> Hi,
> 
> On Tue, Sep 20, 2011 at 20:30, Stefano Sabatini <stefasab at gmail.com> wrote:
> > Address trac issue #378.
> > ---
> >  doc/filters.texi          |   68 ++++++++++++++++++++-
> >  libavfilter/vf_drawtext.c |  143 ++++++++++++++++++++++++++++++++++++++++-----
> >  2 files changed, 191 insertions(+), 20 deletions(-)
> >
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index 1ab6450..f7f7865 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -724,10 +724,13 @@ parameter @var{text}.
> >  If both text and textfile are specified, an error is thrown.
> >
> >  @item x, y
> > -The offsets where text will be drawn within the video frame.
> > -Relative to the top/left border of the output image.

> > +The expressions which express the offsets where text will be drawn
> 
> Maybe "x, y express the offsets where text will be drawn"

I wanted to stress the fact that x and y contain "expressions", I
removed the awkward repetition changing it to:

|The expressions which specify the offsets where text will be drawn

> 
> > +within the video frame. They are relative to the top/left border of the
> > +output image.
> >
> > -The default value of @var{x} and @var{y} is 0.
> > +The default value of @var{x} and @var{y} is "0".
> > +
> > +See below for the list of accepted constants.
> >
> >  @item fontsize
> >  The font size to be used for drawing text.
> > @@ -795,6 +798,43 @@ The size in number of spaces to use for rendering the tab.
> >  Default value is 4.
> >  @end table
> >
> > +The parameters for @var{x} and @var{y} are expressions containing the
> > +following constants:
> > +
> > + at table @option
> > + at item E, PI, PHI
> > +the corresponding mathematical approximated values for e
> > +(euler number), pi (greek PI), PHI (golden ratio)
> > +
> > + at item w, h
> > +the input width and heigth
> > +
> > + at item tw, text_w
> > +the width of the rendered text
> > +
> > + at item th, text_h
> > +the height of the rendered text
> > +
> > + at item lh, line_h
> > +the height of each text line
> 

> It would be nice to expose too either the ascent or the descent
> (y_max or y_min in code).

Please can you suggest an application for this? So I can add an
illustrative example in the docs.

> 
> [...]
> 
> > diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
> > index d7447c2..ffc2bdf 100644
> > --- a/libavfilter/vf_drawtext.c
> > +++ b/libavfilter/vf_drawtext.c
> > @@ -30,6 +30,7 @@
> >  #include <time.h>
> >
> >  #include "libavutil/colorspace.h"
> > +#include "libavutil/eval.h"
> >  #include "libavutil/file.h"
> >  #include "libavutil/opt.h"
> >  #include "libavutil/parseutils.h"
> > @@ -45,6 +46,46 @@
> >  #include FT_FREETYPE_H
> >  #include FT_GLYPH_H
> >
> > +static const char *var_names[] = {
> > +    "E",
> > +    "PHI",
> > +    "PI",
> > +    "w",             ///< width  of the input video
> > +    "h",             ///< height of the input video
> > +    "tw", "text_w",  ///< width  of the rendered text
> > +    "th", "text_h",  ///< height of the rendered text
> > +    "lh", "line_h",  ///< height of each line
> > +    "sar",
> > +    "dar",
> > +    "hsub",
> > +    "vsub",
> > +    "x",
> > +    "y",
> > +    "n",            ///< number of frame
> > +    "t",            ///< timestamp expressed in seconds
> > +    NULL
> > +};
> > +
> > +enum var_name {
> > +    VAR_E,
> > +    VAR_PHI,
> > +    VAR_PI,
> > +    VAR_W,
> > +    VAR_H,
> > +    VAR_TW, VAR_TEXT_W,
> > +    VAR_TH, VAR_TEXT_H,
> > +    VAR_LH, VAR_LINE_H,
> > +    VAR_SAR,
> > +    VAR_DAR,
> > +    VAR_HSUB,
> > +    VAR_VSUB,
> > +    VAR_X,
> > +    VAR_Y,
> > +    VAR_N,
> > +    VAR_T,
> > +    VAR_VARS_NB
> > +};
> > +

> >  typedef struct {
> >     const AVClass *class;
> >     uint8_t *fontfile;              ///< font to be used
> > @@ -57,6 +98,11 @@ typedef struct {
> >     char *textfile;                 ///< file with text to be drawn
> >     int x;                          ///< x position to start drawing text
> >     int y;                          ///< y position to start drawing text
> > +    char *x_expr;                   ///< expression for x position
> > +    char *y_expr;                   ///< expression for y position
> > +    AVExpr *x_pexpr, *y_pexpr;      ///< parsed expressions for x and y
> > +    int line_h;                     ///< size of each line
>                                             ^^^^

> It should be "height of each line"

Fixed locally.
-- 
FFmpeg = Fierce Free Moronic Puristic Ephemeral Gem


More information about the ffmpeg-devel mailing list