avfilter/drawtext: change reload value to an interval

Allows user to specify a frame interval at which textfile is reloaded.
This commit is contained in:
Gyan Doshi 2022-02-28 12:55:42 +05:30
parent 72604b10f4
commit 4b72bca6ca
2 changed files with 7 additions and 5 deletions

View File

@ -11278,8 +11278,10 @@ text data in detection bboxes of side data. So please do not use this parameter
if you are not sure about the text source. if you are not sure about the text source.
@item reload @item reload
If set to 1, the @var{textfile} will be reloaded before each frame. The @var{textfile} will be reloaded at specified frame interval.
Be sure to update it atomically, or it may be read partially, or even fail. Be sure to update @var{textfile} atomically, or it may be read partially,
or even fail.
Range is 0 to INT_MAX. Default is 0.
@item x @item x
@item y @item y

View File

@ -198,7 +198,7 @@ typedef struct DrawTextContext {
AVRational tc_rate; ///< frame rate for timecode AVRational tc_rate; ///< frame rate for timecode
AVTimecode tc; ///< timecode context AVTimecode tc; ///< timecode context
int tc24hmax; ///< 1 if timecode is wrapped to 24 hours, 0 otherwise int tc24hmax; ///< 1 if timecode is wrapped to 24 hours, 0 otherwise
int reload; ///< reload text file for each frame int reload; ///< reload text file at specified frame interval
int start_number; ///< starting frame number for n/frame_num var int start_number; ///< starting frame number for n/frame_num var
char *text_source_string; ///< the string to specify text data source char *text_source_string; ///< the string to specify text data source
enum AVFrameSideDataType text_source; enum AVFrameSideDataType text_source;
@ -245,7 +245,7 @@ static const AVOption drawtext_options[]= {
{"timecode_rate", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS}, {"timecode_rate", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS},
{"r", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS}, {"r", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS},
{"rate", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS}, {"rate", "set rate (timecode only)", OFFSET(tc_rate), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS},
{"reload", "reload text file for each frame", OFFSET(reload), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, {"reload", "reload text file at specified frame interval", OFFSET(reload), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS},
{ "alpha", "apply alpha while rendering", OFFSET(a_expr), AV_OPT_TYPE_STRING, { .str = "1" }, .flags = FLAGS }, { "alpha", "apply alpha while rendering", OFFSET(a_expr), AV_OPT_TYPE_STRING, { .str = "1" }, .flags = FLAGS },
{"fix_bounds", "check and fix text coords to avoid clipping", OFFSET(fix_bounds), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, {"fix_bounds", "check and fix text coords to avoid clipping", OFFSET(fix_bounds), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{"start_number", "start frame number for n/frame_num variable", OFFSET(start_number), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS}, {"start_number", "start frame number for n/frame_num variable", OFFSET(start_number), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS},
@ -1565,7 +1565,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
} }
} }
if (s->reload) { if (s->reload && !(inlink->frame_count_out % s->reload)) {
if ((ret = load_textfile(ctx)) < 0) { if ((ret = load_textfile(ctx)) < 0) {
av_frame_free(&frame); av_frame_free(&frame);
return ret; return ret;