[FFmpeg-cvslog] drawtext: allow burning the timecode.

Stefano Sabatini stefasab at gmail.com
Sat Dec 24 16:46:27 CET 2011


On date Monday 2011-12-12 17:53:42 +0100, Clément Bœsch wrote:
> ffmpeg | branch: master | Clément Bœsch <clement.boesch at smartjog.com> | Tue Dec  6 11:19:11 2011 +0100| [fa4e30af7e589c27437d2b96a384d4ad1c3485ad] | committer: Clément Bœsch
> 
> drawtext: allow burning the timecode.
> 
> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fa4e30af7e589c27437d2b96a384d4ad1c3485ad
> ---
> 
>  doc/filters.texi          |    7 +++++++
>  libavfilter/vf_drawtext.c |   22 +++++++++++++++++++++-
>  2 files changed, 28 insertions(+), 1 deletions(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 0980fe6..699e0c1 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -1148,6 +1148,13 @@ the number of input frame, starting from 0
>  
>  @item t
>  timestamp expressed in seconds, NAN if the input timestamp is unknown
> +
> + at item timecode
> +initial timecode representation in "hh:mm:ss[:;.]ff" format. It can be used
> +with or without text parameter. @var{rate} option must be specified
> +
> + at item r, rate
> +frame rate (timecode only)
>  @end table
>  
>  Some examples follow.
> diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
> index 912a854..ffcf512 100644
> --- a/libavfilter/vf_drawtext.c
> +++ b/libavfilter/vf_drawtext.c
> @@ -29,6 +29,8 @@
>  #include <sys/time.h>
>  #include <time.h>
>  
> +#include "libavcodec/timecode.h"
> +#include "libavutil/avstring.h"
>  #include "libavutil/colorspace.h"
>  #include "libavutil/file.h"
>  #include "libavutil/eval.h"
> @@ -154,6 +156,8 @@ typedef struct {
>      AVExpr *d_pexpr;
>      int draw;                       ///< set to zero to prevent drawing
>      AVLFG  prng;                    ///< random
> +    struct ff_timecode tc;
> +    int frame_id;
>  } DrawTextContext;
>  
>  #define OFFSET(x) offsetof(DrawTextContext, x)
> @@ -174,6 +178,9 @@ static const AVOption drawtext_options[]= {
>  {"tabsize",  "set tab size",         OFFSET(tabsize),            AV_OPT_TYPE_INT,    {.dbl=4},     0,        INT_MAX  },
>  {"basetime", "set base time",        OFFSET(basetime),           AV_OPT_TYPE_INT64,  {.dbl=AV_NOPTS_VALUE},     INT64_MIN,        INT64_MAX  },
>  {"draw",     "if false do not draw", OFFSET(d_expr),             AV_OPT_TYPE_STRING, {.str="1"},   CHAR_MIN, CHAR_MAX },
> +{"timecode", "set initial timecode", OFFSET(tc.str),             AV_OPT_TYPE_STRING, {.str=NULL},  CHAR_MIN, CHAR_MAX },
> +{"r",        "set rate (timecode only)", OFFSET(tc.rate),        AV_OPT_TYPE_RATIONAL, {.dbl=0},          0,  INT_MAX },
> +{"rate",     "set rate (timecode only)", OFFSET(tc.rate),        AV_OPT_TYPE_RATIONAL, {.dbl=0},          0,  INT_MAX },
>  
>  /* FT_LOAD_* flags */
>  {"ft_load_flags", "set font loading flags for libfreetype",   OFFSET(ft_load_flags),  AV_OPT_TYPE_FLAGS,  {.dbl=FT_LOAD_DEFAULT|FT_LOAD_RENDER}, 0, INT_MAX, 0, "ft_load_flags" },
> @@ -333,9 +340,16 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
>          av_file_unmap(textbuf, textbuf_size);
>      }
>  
> +    if (dtext->tc.str) {
> +        if (ff_init_smtpe_timecode(ctx, &dtext->tc) < 0)
> +            return AVERROR(EINVAL);
> +        if (!dtext->text)
> +            dtext->text = av_strdup("");
> +    }
> +
>      if (!dtext->text) {
>          av_log(ctx, AV_LOG_ERROR,
> -               "Either text or a valid file must be provided\n");
> +               "Either text, a valid file or a timecode must be provided\n");
>          return AVERROR(EINVAL);
>      }
>  
> @@ -708,6 +722,12 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
>          buf_size *= 2;
>      } while ((buf = av_realloc(buf, buf_size)));
>  
> +    if (dtext->tc.str) {
> +        char tcbuf[sizeof("hh:mm:ss.ff")];

> +        avpriv_timecode_to_string(tcbuf, &dtext->tc, dtext->frame_id++);

This is adding a strong dependency of drawtext on libavcodec -> no
good. The dependency could be made conditional compilation-time, by
using the CONFIG_AVCODEC macro, and disabling the feature (but not the
filter) if libavcodec was not enabled.

Alternatively we may consider to move the timecode thing to libavutil.
-- 
FFmpeg = Fancy & Fiendish Mastodontic Purposeless Ermetic Gnome


More information about the ffmpeg-cvslog mailing list