From patchwork Wed Sep 6 20:28:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Foucu X-Patchwork-Id: 5014 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp1108020jao; Wed, 6 Sep 2017 13:57:14 -0700 (PDT) X-Received: by 10.28.72.87 with SMTP id v84mr634604wma.138.1504731434622; Wed, 06 Sep 2017 13:57:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504731434; cv=none; d=google.com; s=arc-20160816; b=ntbWDaA0twiBvUPU8pJ2HkHTjqTwkd0pSiOg3lQGeI6qdAlAGa8vmltXC39bzHdp6l t+TUVnG62ei1ARUtPLDGclwmzrVgF0JZQnI+fXRGwinoQf7D/hDvD7D0puBUIklDMcbU 7b7naVJcWhEBolwWki6zVzxElUWDJUI3IEg4l0Vg874PC7mbbicN4Vo/f4OiLuP8u3OD 7yUYlECv0S/97adPz5cJ7vZnG0/h2JM5LH07mxKitZajKRWgjXhjPyGJw3NOxbuCtDrt y0P+mYTKABo9kmoBrmQAn4yM7TqDUyUzMKjqSf0eIz2ACPP/WbjlM/uj9pMLoeUXf+D3 umhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=vlg3jqX3ZtiTOLLGMXq4ubkfcYaDZ2ECwpJfE6REU5c=; b=Z5N7347mZQLlVBi1ORsidOM9Ic+RRRs7IlRFJQJCTF+I98zt3x7OjqHOBpa7gPz4Uf FyDfLoOCnyr8GSjJku6Q5Vrc0PtyFaiyzQqf3uwZcse+rPgP6PLIKp0xDmMrwPTNYl0n Fy1lIFzLNxm04urA8Bpwl7mUpj2F9joETRw6rLEFIDJu0hji2OOfyhLQH6CGvNok+2Io thdXq/VKGMEazNZTL+4oTEABVuB4+H/33tAO2tT327WP4VrRpnQdMR0ks4v2Io2snLKw MJRwvOVmZp0WlJZC644oDxniJBEeXQRkYYhn8bxEEIv/guKW1yq8OU4Hk1UaDK1AYw7O jydA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Cxx1qy9i; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o76si663759wrb.226.2017.09.06.13.57.13; Wed, 06 Sep 2017 13:57:14 -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=@gmail.com header.s=20161025 header.b=Cxx1qy9i; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 61B96680960; Wed, 6 Sep 2017 23:57:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9C44B680960 for ; Wed, 6 Sep 2017 23:57:02 +0300 (EEST) Received: by mail-pg0-f66.google.com with SMTP id t3so4001926pgt.5 for ; Wed, 06 Sep 2017 13:57:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=CSsNrXxDinHk/01vUrL0khiTIF5Yvtn1H2T0fHz1TW4=; b=Cxx1qy9iZpvx+XvKqf10RWXD+GR7r7kDvNOvOgOKAO9Z4RrywrkiN7HO03NJ9cDgS/ i9ELOABi5EdlxBMGEylyVn80FhggewNLxo/Dvp+Ga5hZJdE9J2Fd7d1WifIGNut9EDZW FgCuZLn+9+ygh4nAbpDaxBeR25zKihepn6NY1XGDsMUTbG6lezYBYSQ/gQM5FXnUotax QXoUDKQNzGYb53lJ9drGOLYHqgb7Z6AA2z3KyQObdYOJMBCFfW6+hmZDVGtTNU2n5w1j v3S/P+2G1tWf6rMByvS20JSNcGw3dPrXgsIlMYyEikHh8A0jsFPoMqtRtrwWGjaXfT6R WvIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=CSsNrXxDinHk/01vUrL0khiTIF5Yvtn1H2T0fHz1TW4=; b=DY8w0bpoD44TKBeGAXbsqIoq9LI2Z1Iuihi0pj046ZDY/YvTu9you3vZAeid/vioUQ /4PVbDxXH6oElkZN93FbuNU7/dKrjnsRHit8vf0PLTJ+46xKuuInTbesIDB84qb0a+AL tPQsgJA/bgb2ZOqw/AixhIDCd+niSlcE5WcmfIJCmIzfpNk3EG7B2Qs1crMce+AVXX48 u28nzGdbCfAB+ViVgowAeGBAJ6oFSuaDKN4vKThkmSSJfOZmg3n8B+z9bSECbM+w/s1J J6E2+2Xp69KKJ+DZCl7LvLBDJOPqj4BQPA+9MIRohVIbzNGnjaQlWAgSE1ZlgwyA9afa rs6Q== X-Gm-Message-State: AHPjjUgr+NtQV47kXzJTCtfJV5Cu81RF1Li60DRrZeCsH9f6n54EIPgg BBCUsLubMk5C5vJFZRs= X-Google-Smtp-Source: ADKCNb6aGs60D5SL5sjDYb8nV6L0Wa9BhBIJEHGYWN2fdLcKby1dMIzwDSzj+6kUNnBW0nPCOLbeNQ== X-Received: by 10.99.96.133 with SMTP id u127mr344005pgb.237.1504729728505; Wed, 06 Sep 2017 13:28:48 -0700 (PDT) Received: from tfoucu.mtv.corp.google.com ([172.27.196.64]) by smtp.gmail.com with ESMTPSA id t16sm784468pfj.117.2017.09.06.13.28.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Sep 2017 13:28:48 -0700 (PDT) From: Thierry Foucu To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Sep 2017 13:28:07 -0700 Message-Id: <20170906202807.17675-1-tfoucu@gmail.com> X-Mailer: git-send-email 2.14.1.581.gf28d330327-goog Subject: [FFmpeg-devel] [PATCH] vf_fps: uses the last frame duration to duplicate it if needed 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: Thierry Foucu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavfilter/vf_fps.c | 40 +++++++++++++++++++++++++++++++++++----- tests/ref/fate/filter-fps | 6 ++++++ tests/ref/fate/filter-fps-r | 4 ++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index 20ccd797d1..a231da415c 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -137,13 +137,43 @@ static int request_frame(AVFilterLink *outlink) AVFrame *buf; av_fifo_generic_read(s->fifo, &buf, sizeof(buf), NULL); - buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base, - outlink->time_base) + s->frames_out; + if (av_fifo_size(s->fifo)) { + buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base, + outlink->time_base) + s->frames_out; - if ((ret = ff_filter_frame(outlink, buf)) < 0) - return ret; + if ((ret = ff_filter_frame(outlink, buf)) < 0) + return ret; - s->frames_out++; + s->frames_out++; + } else { + /* This is the last frame, we may have to duplicate it to match + * the last frame duration */ + int j; + int delta = av_rescale_q_rnd(buf->pts + buf->pkt_duration - s->first_pts, + ctx->inputs[0]->time_base, + outlink->time_base, s->rounding) - s->frames_out ; + if (delta > 0 ) { + for (j = 0; j < delta; j++) { + AVFrame *dup = av_frame_clone(buf); + + av_log(ctx, AV_LOG_DEBUG, "Duplicating frame.\n"); + dup->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base, + outlink->time_base) + s->frames_out; + + if ((ret = ff_filter_frame(outlink, dup)) < 0) + return ret; + + s->frames_out++; + } + } else { + buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base, + outlink->time_base) + s->frames_out; + + if ((ret = ff_filter_frame(outlink, buf)) < 0) + return ret; + s->frames_out++; + } + } } return 0; } diff --git a/tests/ref/fate/filter-fps b/tests/ref/fate/filter-fps index 55712cfb1c..242fb04e85 100644 --- a/tests/ref/fate/filter-fps +++ b/tests/ref/fate/filter-fps @@ -85,3 +85,9 @@ 0, 79, 79, 1, 30576, 0xa2fcd06f 0, 80, 80, 1, 30576, 0xa2fcd06f 0, 81, 81, 1, 30576, 0xd4150aad +0, 82, 82, 1, 30576, 0xd4150aad +0, 83, 83, 1, 30576, 0xd4150aad +0, 84, 84, 1, 30576, 0xd4150aad +0, 85, 85, 1, 30576, 0xd4150aad +0, 86, 86, 1, 30576, 0xd4150aad +0, 87, 87, 1, 30576, 0xd4150aad diff --git a/tests/ref/fate/filter-fps-r b/tests/ref/fate/filter-fps-r index 826b1ed6c6..c1bc7d1547 100644 --- a/tests/ref/fate/filter-fps-r +++ b/tests/ref/fate/filter-fps-r @@ -72,3 +72,7 @@ 0, 79, 79, 1, 30576, 0xa2fcd06f 0, 80, 80, 1, 30576, 0xa2fcd06f 0, 82, 82, 1, 30576, 0xd4150aad +0, 83, 83, 1, 30576, 0xd4150aad +0, 84, 84, 1, 30576, 0xd4150aad +0, 85, 85, 1, 30576, 0xd4150aad +0, 86, 86, 1, 30576, 0xd4150aad