[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