diff --git a/doc/filters.texi b/doc/filters.texi index 5847c75eb7..21a3c0f5b2 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -3030,6 +3030,9 @@ It can accept an argument: a strftime() format string. @item n, frame_num The frame number, starting from 0. +@item pict_type +A 1 character description of the current picture type. + @item pts The timestamp of the current frame, in seconds, with microsecond accuracy. diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index c404fa53c5..ef5bb03be4 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -72,6 +72,7 @@ static const char *const var_names[] = { "text_w", "tw", ///< width of the rendered text "x", "y", + "pict_type", NULL }; @@ -108,6 +109,7 @@ enum var_name { VAR_TEXT_W, VAR_TW, VAR_X, VAR_Y, + VAR_PICT_TYPE, VAR_VARS_NB }; @@ -608,6 +610,15 @@ static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char return AVERROR(ENOSYS); } +static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp, + char *fct, unsigned argc, char **argv, int tag) +{ + DrawTextContext *dtext = ctx->priv; + + av_bprintf(bp, "%c", av_get_picture_type_char(dtext->var_values[VAR_PICT_TYPE])); + return 0; +} + static int func_pts(AVFilterContext *ctx, AVBPrint *bp, char *fct, unsigned argc, char **argv, int tag) { @@ -677,6 +688,7 @@ static const struct drawtext_function { } functions[] = { { "expr", 1, 1, 0, func_eval_expr }, { "e", 1, 1, 0, func_eval_expr }, + { "pict_type", 0, 0, 0, func_pict_type }, { "pts", 0, 0, 0, func_pts }, { "gmtime", 0, 1, 'G', func_strftime }, { "localtime", 0, 1, 'L', func_strftime }, @@ -987,6 +999,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) dtext->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ? NAN : frame->pts * av_q2d(inlink->time_base); + dtext->var_values[VAR_PICT_TYPE] = frame->pict_type; + draw_text(ctx, frame, frame->width, frame->height); av_log(ctx, AV_LOG_DEBUG, "n:%d t:%f text_w:%d text_h:%d x:%d y:%d\n",