diff options
author | Clément Bœsch <clement.boesch@smartjog.com> | 2011-12-06 11:19:11 +0100 |
---|---|---|
committer | Clément Bœsch <ubitux@gmail.com> | 2011-12-12 17:49:34 +0100 |
commit | fa4e30af7e589c27437d2b96a384d4ad1c3485ad (patch) | |
tree | 920d3d2a790d002d2d00623095182bf38701cbc4 /libavfilter/vf_drawtext.c | |
parent | ad5ade6615d5bb224cab99f91e162abbbe6c160a (diff) | |
download | ffmpeg-fa4e30af7e589c27437d2b96a384d4ad1c3485ad.tar.gz |
drawtext: allow burning the timecode.
Diffstat (limited to 'libavfilter/vf_drawtext.c')
-rw-r--r-- | libavfilter/vf_drawtext.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index 912a8547bb..ffcf512992 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++); + buf = av_asprintf("%s%s", dtext->text, tcbuf); + } + if (!buf) return AVERROR(ENOMEM); text = dtext->expanded_text = buf; |