From patchwork Tue Dec 25 20:40:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Moritz Barsnick X-Patchwork-Id: 11546 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B9B7044CBA9 for ; Tue, 25 Dec 2018 22:41:15 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 66B9668AEE2; Tue, 25 Dec 2018 22:41:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 71B7B68ADDD for ; Tue, 25 Dec 2018 22:41:06 +0200 (EET) Received: from goodtimes.fritz.box ([79.223.42.222]) by mail.gmx.com (mrgmx001 [212.227.17.190]) with ESMTPSA (Nemesis) id 0Lp3Lw-1hGQra3i44-00ew0e; Tue, 25 Dec 2018 21:41:10 +0100 From: Moritz Barsnick To: FFmpeg development discussions and patches Date: Tue, 25 Dec 2018 21:40:51 +0100 Message-Id: <20181225204051.31082-1-barsnick@gmx.net> X-Mailer: git-send-email 2.14.5 X-Provags-ID: V03:K1:VLR4IIsgO9LMHBYmJTnieX/56vSrXIkTrRI0Bi3EWQ1JcWSXoNN 2U4aYfIu7fDFa3St7kWSPXA9fKIGkVMeDhbBqeGgKQKVNBxWqUE48kwTzlLBGwdJYujiGQg wjL252FcHAWJpFD9Nypz+gv/ZfMbRnW767gyNeKRJi1XMx81qTfU0YAzk5B+2YoMKGXuGJR lmRZhukyuaBng7KZ0/OWQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:Uooo7HL6xR4=:W5OJ1Z21RNeiR7NLQM1BGU O9dMgMu3YYWGPR54LsBuVkXZbj2QPzR4QQqRxLYghyF2pQKfpbVZz8uMidsNFCc4B4Dj5reYz /TY96J1edBaIcFWTAXuJzOZReGIxMZE6+pSmbELSJFRcOkOBSwIIPRg1wiZ7E1yIXFi0o32G8 JevzaFLELyXw8kSeDPHeIYkd/cVAQzIgO5aOuYZMxFz7bzjEz+ljEhbiX/BG1geXSeNy+j4Nn WSziu7c2j6Ya3G5PNzqR0chOV9LIp3+qBwDOo85DPN7Qp7q3WDKUyovwojF+2PO7NJZHSFQnF ZVevaGGzYiM9KN0HG3xBPmY8o/2C84ZRWQ4q15hVlHHzVAG/VgA1dwdmrXYJXFpd467+O7EJV JRaDSDWvu0NgQJJjDYTS/jozLltSA4XGmDqkEgr3UwbSbuTqtglkMKv8dsNx3e4LypmoBdgP/ IVAH+1n/1yOlohArBN6qECbmdUWjwe4YRnOt2WeeY3BSDEZoxxzvlNcP1YGN5DD5Emmy2zZYV ENFy4MibnjW9e25OGCzSPRNV4BFuoeZ1ac33kmpXnyYdLNFFwY2QNmUIYy1/8sjUcWjdc7oS/ /McXcWwIS3NFELXkbjR/6/90LV5quzdP5YRZzyhiO5KKR9ihlN3HJGu/Jx0W4SdIWMwS10PQD z+RuL1631wY4VM7x7EL64MVqkU4rt0w9CefGHoKjvPalIxVhwenb4iwRYYI8pRPc5ryitAmSx AznYQdPM7JJwpKQMd4zPQTItQaTq9evJ9Z59aRTg7dxFl1CAiYaOi6INLFpySYEMkSBilMv7D 2+6Ez3UjlCOQYtfc/myE53xYzThMKZB7LGmTg4lzUK/cCGiqDLge1fDqs7GevH3tzPlXwSD7T szBCSQBwP4xpmrfHr6u+CPB/b+10gXDwKNJ7Rt8l4= Subject: [FFmpeg-devel] [PATCH] avfilter/f_realtime: add option to scale speed X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Moritz Barsnick MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Moritz Barsnick --- This adds two double precision divisions per frame, which seems acceptable. I'm not sure scaling the limit by the factor is the correct idea. It feels right regarding the discontinuities, but not according to the limit option's description. doc/filters.texi | 4 ++++ libavfilter/f_realtime.c | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 65ce25bc18..60ebf2aa99 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -20829,6 +20829,10 @@ They accept the following options: @item limit Time limit for the pauses. Any pause longer than that will be considered a timestamp discontinuity and reset the timer. Default is 2 seconds. +@item speed +Speed factor for processing. The value must be a float larger than zero. +Values larger than 1.0 will speed up processing, smaller will slow it down. +The @var{limit} is automatically adapted accordingly. Default is 1.0. @end table @anchor{select} diff --git a/libavfilter/f_realtime.c b/libavfilter/f_realtime.c index 171c16aaaa..8d4fbf642b 100644 --- a/libavfilter/f_realtime.c +++ b/libavfilter/f_realtime.c @@ -22,11 +22,13 @@ #include "libavutil/time.h" #include "avfilter.h" #include "internal.h" +#include typedef struct RealtimeContext { const AVClass *class; int64_t delta; int64_t limit; + double speed; unsigned inited; } RealtimeContext; @@ -36,7 +38,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) RealtimeContext *s = ctx->priv; if (frame->pts != AV_NOPTS_VALUE) { - int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q); + int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q) / s->speed; int64_t now = av_gettime_relative(); int64_t sleep = pts - now + s->delta; if (!s->inited) { @@ -44,7 +46,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) sleep = 0; s->delta = now - pts; } - if (sleep > s->limit || sleep < -s->limit) { + if (sleep > s->limit / s->speed || sleep < -s->limit / s->speed) { av_log(ctx, AV_LOG_WARNING, "time discontinuity detected: %"PRIi64" us, resetting\n", sleep); @@ -65,6 +67,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM static const AVOption options[] = { { "limit", "sleep time limit", OFFSET(limit), AV_OPT_TYPE_DURATION, { .i64 = 2000000 }, 0, INT64_MAX, FLAGS }, + { "speed", "speed factor", OFFSET(speed), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, DBL_MIN, DBL_MAX, FLAGS }, { NULL } };