[FFmpeg-devel] [PATCH] drawtext: fix hard dependency to lavc (timecode).
Stefano Sabatini
stefasab at gmail.com
Wed Dec 28 13:28:42 CET 2011
On date Wednesday 2011-12-28 10:25:02 +0100, Clément Bœsch encoded:
> From: Clément Bœsch <clement.boesch at smartjog.com>
>
> ---
> As Stefano proposed, we might want to move the timecode stuff to lavu at some
> point. But right now, since there are already some function renames waiting for
> the next bump, I'd wait until then. Also, the API might not be mature enough to
> be exported properly, thus we might reconsider when the timecode support is
> more complete.
> ---
> libavfilter/vf_drawtext.c | 19 +++++++++++++++++++
> 1 files changed, 19 insertions(+), 0 deletions(-)
>
> diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
> index 344c8db..fc0fcc4 100644
> --- a/libavfilter/vf_drawtext.c
> +++ b/libavfilter/vf_drawtext.c
> @@ -29,8 +29,14 @@
> #include <sys/time.h>
> #include <time.h>
>
> +#include "config.h"
> +
> +#if CONFIG_AVCODEC
> +/* timecode related includes */
> #include "libavcodec/timecode.h"
> #include "libavutil/avstring.h"
> +#endif
> +
> #include "libavutil/colorspace.h"
> #include "libavutil/file.h"
> #include "libavutil/eval.h"
> @@ -156,8 +162,10 @@ typedef struct {
> AVExpr *d_pexpr;
> int draw; ///< set to zero to prevent drawing
> AVLFG prng; ///< random
> +#if CONFIG_AVCODEC
> struct ff_timecode tc;
> int frame_id;
> +#endif
> } DrawTextContext;
>
> #define OFFSET(x) offsetof(DrawTextContext, x)
> @@ -178,9 +186,11 @@ 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 },
> +#if CONFIG_AVCODEC
> {"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 },
> +#endif
>
> /* 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" },
> @@ -340,16 +350,23 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
> av_file_unmap(textbuf, textbuf_size);
> }
>
> +#if CONFIG_AVCODEC
> if (dtext->tc.str) {
> if (avpriv_init_smpte_timecode(ctx, &dtext->tc) < 0)
> return AVERROR(EINVAL);
> if (!dtext->text)
> dtext->text = av_strdup("");
> }
> +#endif
>
> if (!dtext->text) {
> +#if CONFIG_AVCODEC
> av_log(ctx, AV_LOG_ERROR,
> "Either text, a valid file or a timecode must be provided\n");
> +#else
> + av_log(ctx, AV_LOG_ERROR,
> + "Either text or a valid file must be provided\n");
> +#endif
nit: maybe factorize the first line
> return AVERROR(EINVAL);
> }
>
> @@ -722,11 +739,13 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
> buf_size *= 2;
> } while ((buf = av_realloc(buf, buf_size)));
>
> +#if CONFIG_AVCODEC
> 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);
> }
> +#endif
>
> if (!buf)
> return AVERROR(ENOMEM);
Looks good to me, but please mention it in the docs for
completeness-sake, in the unlikely case an user won't compile
libavfilter against libavcodec, something along the lines of:
| The @option{timecode}, @option{t}, and @option{rate} options are
| only available if libavfilter was built with libavcodec enabled.
Alternatively you may consider a run-time error issued in case one of
those options is called and CONFIG_AVCODEC was not enabled.
Thanks.
--
FFmpeg = Freak & Fiendish Multimedia Pacific Ermetic Glue
More information about the ffmpeg-devel
mailing list