Compared to gmtime and localtime, rtctime has higher resolution. For example, it can be used to show the end-to-end latency. On the same host, publish a stream by:
./ffmpeg \ -re -f lavfi -i "color=color=blue:size=1280x720:rate=60" \ -c:v libx264 \ -tune zerolatency \ -vf "drawtext=text='push %{rtctime\:hms} pts %{pts\:hms}':x=10:y=(h-th)/2:fontsize=30:box=1:boxcolor=white:boxborderw=30" \ -f flv $url Use ffplay to show the latency: ./ffplay -threads 1 \ -vf "drawtext=text='play %{rtctime\:hms} pts %{pts\:hms}':x=10:y=th:fontsize=30:box=1:boxcolor=white:boxborderw=30,setpts=PTS*4/5" \ "$url" --- doc/filters.texi | 3 +++ libavfilter/version.h | 2 +- libavfilter/vf_drawtext.c | 24 ++++++++++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 78faf767cf..b2d4660327 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -10953,6 +10953,9 @@ It can accept an argument: a strftime() format string. The time at which the filter is running, expressed in the local time zone. It can accept an argument: a strftime() format string. +@item rtctime +The time at which the filter is running, can use the same format as @samp{pts}. + @item metadata Frame metadata. Takes one or two arguments. diff --git a/libavfilter/version.h b/libavfilter/version.h index f12bc876ae..5052681653 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -31,7 +31,7 @@ #define LIBAVFILTER_VERSION_MAJOR 8 #define LIBAVFILTER_VERSION_MINOR 0 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MICRO 102 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index f7b9c25e62..e20b556a87 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -51,6 +51,7 @@ #include "libavutil/opt.h" #include "libavutil/random_seed.h" #include "libavutil/parseutils.h" +#include "libavutil/time.h" #include "libavutil/timecode.h" #include "libavutil/time_internal.h" #include "libavutil/tree.h" @@ -959,12 +960,11 @@ static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp, return 0; } -static int func_pts(AVFilterContext *ctx, AVBPrint *bp, - char *fct, unsigned argc, char **argv, int tag) +static int func_time_common(AVFilterContext *ctx, AVBPrint *bp, + char *fct, unsigned argc, char **argv, int tag, + double pts) { - DrawTextContext *s = ctx->priv; const char *fmt; - double pts = s->var_values[VAR_T]; int ret; fmt = argc >= 1 ? argv[0] : "flt"; @@ -1019,6 +1019,21 @@ static int func_pts(AVFilterContext *ctx, AVBPrint *bp, return 0; } +static int func_pts(AVFilterContext *ctx, AVBPrint *bp, + char *fct, unsigned argc, char **argv, int tag) +{ + DrawTextContext *s = ctx->priv; + double pts = s->var_values[VAR_T]; + return func_time_common(ctx, bp, fct, argc, argv, tag, pts); +} + +static int func_rtctime(AVFilterContext *ctx, AVBPrint *bp, + char *fct, unsigned argc, char **argv, int tag) +{ + double pts = av_gettime() / 1000000.0; + return func_time_common(ctx, bp, fct, argc, argv, tag, pts); +} + static int func_frame_num(AVFilterContext *ctx, AVBPrint *bp, char *fct, unsigned argc, char **argv, int tag) { @@ -1153,6 +1168,7 @@ static const struct drawtext_function { { "pts", 0, 3, 0, func_pts }, { "gmtime", 0, 1, 'G', func_strftime }, { "localtime", 0, 1, 'L', func_strftime }, + { "rtctime", 0, 3, 0, func_rtctime }, { "frame_num", 0, 0, 0, func_frame_num }, { "n", 0, 0, 0, func_frame_num }, { "metadata", 1, 2, 0, func_metadata }, -- 2.31.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".