From patchwork Thu Jun 10 13:25:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 28192 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:c91a:0:0:0:0:0 with SMTP id z26csp507556iol; Thu, 10 Jun 2021 06:25:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwebvjNXGwjPsS1ac5LLCWUxs1vj3utJ8EnngFYsqBsc1l0baNABgj2Jv13lYXE4xzRdlc9 X-Received: by 2002:a17:906:a2d0:: with SMTP id by16mr4523005ejb.37.1623331553275; Thu, 10 Jun 2021 06:25:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623331553; cv=none; d=google.com; s=arc-20160816; b=aEefQvYq5N7rCGlNK96SUZyFgsg/a5YQ3yr4/zReol5k6rn1QoNp+kQkO3kSJKsEnF 5hx2h0WR98riCpiWZ+VHA7moFqKRJQ653ACqsLLqJ3p0icIN6/hH9wPIRWKx4zNIyXoV qZPTrab1uBtzq+LHdvl5RmKC/I672as9WIO8AjW05psLlulJOJCd2FuW7LLHfYxMm7wB VJS9GsIf94EBf1CqWY9iUjkcshqwotXdveR3bzJfI+EqparZuV1jRFpsq83F79ERjCMX r/vigxo6CL7QxAMN/dpaYeI5QknoZxfF+thdnIdzEh6Dpnybsn1a48IN/sTJOdrm68sI wpgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to:date :to:from:message-id:dkim-signature:delivered-to; bh=2BMigB+K9US1CMn4eT+tWyoNGQWdL6N3vT58OjZ6wag=; b=ubhnPMZaf/x4045lS1RE2N+L1TEgKFsPxKUq+20wLtOt3+wiO39F0nAbOy84gq6CFi GQJLao0HBMwhbi4z2Hl5C8AtixckW6OBrWMqHassQiql0c01GQfCD1R+Flrdo+/5Xc+E D1OvJbQ7iHUYTSK0UVYmZc8MC+U5ZpS561d58igHt/mnkxWNnmT1Dy6gQdTeozVXeFed j4l3cAexSOWJ2/y3KBNP58aHLgCtFNrono7xFjEq7HRRRW4EkuWyRq43rnpyrrZYorwg mOcGVViQvb4EKz4rK+DU8iaap1MlKAEffnoTiqds3l2u8bT4GnQvWFgbkLYVMNZCV03T Qr7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=ZUX2H+Mg; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id co3si2230744edb.121.2021.06.10.06.25.52; Thu, 10 Jun 2021 06:25:53 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=ZUX2H+Mg; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5FD54687FE1; Thu, 10 Jun 2021 16:25:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out203-205-221-192.mail.qq.com (out203-205-221-192.mail.qq.com [203.205.221.192]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 46D8C680C0F for ; Thu, 10 Jun 2021 16:25:26 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1623331521; bh=HreOzadOoLeOp5L3ka27SP5thH9CnldDonvK/OthM9E=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZUX2H+Mg902+Vy9yC+nUFuEE3u+gbp/CmB5tizIH/dnNNkmWyhvbD8oLVOdbxwmke 39LIfQ/HD/HEEOg+02wQeFmuJhdsIroQiUaqtZ7/mXzcqKGibY5eyD35S50030yaGE Sqeo2uGbtnFw/FA5JG07Oeiw8xjSWrHsL0c1wz54= Received: from ZHILIZHAO-MB2.tencent.com ([113.108.77.59]) by newxmesmtplogicsvrszc9.qq.com (NewEsmtp) with SMTP id 65192CB2; Thu, 10 Jun 2021 21:25:17 +0800 X-QQ-mid: xmsmtpt1623331518tdpiwcmzf Message-ID: X-QQ-XMAILINFO: OGn2S7BqG7Pa2BCSFcnhIzxROA3liexQIv4zKi/kcB5/WEIB1+K0LRrwAi1YOX WcWa7Hvg5WWI9IKoeNvAIHVaxAvWoGqma+xiB2ctZyZnKTnjw03S1Hb3oNP1Ha1xCZJrQB5LogJ6 azOBD0m9zh+pamLe+e8ncW5GrX2E1YBvKREcuBcNufvjsgT0Cl1qixXQdaqezlhxItmDnc+y6M4g IqY3OnCCdkHH5gZSCJa/Hxz4kyfjYTzh4YJQHRzWdEe6XXbhk5W7OVWcFLcTRLFT6a4cfFY1uKDp A6q4ngiZPyMvGBpDBnADklCnE8uQ6KunqOBkrcE686tzCXW4QkIeZ03NPYoZsbcuj+VcEaMiX055 8wUuLvO7zOCXZUQPI038lZfoBcY/tx4+QcP9vkxGfdH5SHWtesX9IAUWowRh5Cos6YkjmTEX8l5d uzaMVseOnaQMJg9FVLY44Lv210HoGmCQNuZ5SsW+iOfTlTMegV/fCtY0CkT5XSah6fFM2ei39umD GN3pHeWoQxx7JJgQyK1EiAgp04R/9cXnhlp9nqrJEJgKq3hiIgtUYHA9Ayl3SVIju3RHcKboGf4M UVEl5df/xGtVd5aNnp+KvYqh2FbDD2fLIr7XP5MoGuLmqb9xQtlpr8T/6xKV5gYS8+3Xh5tFAH3p tDxZv/2bDD3vQf1nlyi6Egukcg0SYCtUHWpPYimt7TlVF2XIkKRGMM3pbZoacJywNaZ0SglQR8St sajJy+dTOI73OjE1gMn2mdENkk8Vi9Mj3Do9EM3ByLZSZ9KXO7npmdUiok5bQ8X3ohtTMTYXe9Yw 3WGGngSBF1EtA2FCVFIr8y1Z54PBtyBhs= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Thu, 10 Jun 2021 21:25:02 +0800 X-OQ-MSGID: <20210610132502.16841-2-quinkblack@foxmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210610132502.16841-1-quinkblack@foxmail.com> References: <20210610132502.16841-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avfilter/vf_drawtext: add rtctime X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VbteXH86eLfG 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 },