From patchwork Mon Sep 11 21:00:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Foucu X-Patchwork-Id: 5098 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.36.26 with SMTP id f26csp3523688jaa; Mon, 11 Sep 2017 14:00:54 -0700 (PDT) X-Received: by 10.223.136.204 with SMTP id g12mr10611116wrg.74.1505163654535; Mon, 11 Sep 2017 14:00:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1505163654; cv=none; d=google.com; s=arc-20160816; b=GLijpvrfKd5vMP1y10NFuzPpFHuTDVIMPAxS7d37cUqy61e4DKt8P73RW0yEYcqF55 DIa7T95xz1Fc+e1YRnXfk3E9aU92tWuXWCF8euDhMIXmWcNgyygueX3q0eR0c5bgiFXW rhN2WJf/Qe3hd2SWMcG4i9f2BX8FCY94ym7+gT9HiYTKFk9LBnEVEN+ruWSsIRQbTkuE oztxEOhnAv1QQCBumDwEpa7m+V1Ku85VKZhTA9ieLSslcvhl/kmkqd3z0YRDo9xXO+JJ VJg/dHyFsZ0Dkr6aS74CBG3sg58xU5jnzAw+L9hQwWvIFmEtjXifGyhrO82q8yh3pr2H a++A== 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:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=vjN9AJXddk65c2l/LOcznm/N8xh3GJOL7yPtKqV9JK8=; b=aQpHWDcnG/BTM47LsvE+Bb7Usrfim/KvPZNJ++okfparIZLpq3WgPcgX+fMHY0XY+y vejdhgYedUsJt98Nt1DB2sdfg0hLDyjDEJZ1JQ0jPStm7UWIZ2sEWrUP9quIFBtOT3lv UNoqwYEg8OtagGoaBfRErW8cKxh9wNYyIvIHB2umqao1fVqOGyYLpI7mkFKZo17TyDbY c6/5oyyiMOG5OwQWpxKEiuRxnTwjzGC9j+ob6mcDLkja0mO/8U+0kJZ0LYxtutOdpAqd 7y84f1kNLEq9XLoTH6UReJCoxhuIH6WAZeiDJmXAjbx7heIGs/6aAf1tgV8TwbBz/+Bp FJYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=pOSzDmIY; 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 n19si7676388wmg.26.2017.09.11.14.00.53; Mon, 11 Sep 2017 14:00:54 -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=pOSzDmIY; 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 0B55A689D4C; Tue, 12 Sep 2017 00:00:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 35D1D689BD6 for ; Tue, 12 Sep 2017 00:00:40 +0300 (EEST) Received: by mail-pf0-f196.google.com with SMTP id q76so5375531pfq.5 for ; Mon, 11 Sep 2017 14:00:45 -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:in-reply-to:references; bh=u4Q76ZIbzJRjrOj9htvpKqTMWc1x30A8mtHObXnSwsY=; b=pOSzDmIYsj1adZMR/UgnPUcgisypMQdwD22Oe7VHa2Kgap0ENPWCpN5mETD9p1KDyg SUfaX3xzmM4Oib2Kl/Ypdiqmb/PF4Mtav+lKM2LqP2FL+ab2z7/0Xd8K9f7qdKYrbz+L ZmKleQ30INT6kdXqTgKiIM9lCeUGR3b4R3I0mi/MhhPRqr449VFNw7ND7RVMeb15FJtc aE099zeo/lomTYE8g9U1jK36OuwIe8YbINLxmL4ahP+KzvfUJcoDM/0mF/Wmf0f2samW bYIgA59z9Z9z0Z2w1F1IPj3rqbVjV23Mp3l/xgjuz3vx7JZmQZW8L1HEkLaOiQhiW8a2 2zxA== 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:in-reply-to :references; bh=u4Q76ZIbzJRjrOj9htvpKqTMWc1x30A8mtHObXnSwsY=; b=athcqMGnwMuQeBUdMliD/B+cnGCg7LlDryxOD4qQKxlAT9qSAXoDFfD/Hpi4QqArCo k6lNa1+LzhG1P0EBT8H+mPJFWn+R9/uE4IzXbmpS/msftMOBZlk5aFXXn2YJQLTHMlJm QmMEwEHX4Z3/RG4RlTksENLBVQ+nIICmR7Y0JjTw2XYNwWaFkRqPHfml0qH0GujTGrVG tNgm5p7Gk5kOv0Od7rcllkYmNHCgEwp6kY9k5Z/Q+49dBsmrBQNwaD8ldh98BzhB4Pzw rsBDhom8F/U0sF8SRF5CdlqZbw6fnDuo7TQuMEIX8DXY0Kg9v5kyjXaS2j0o2dQDzZds gI/w== X-Gm-Message-State: AHPjjUjqXnelFMN/+kDG6onmRjbIDpXOD/7i/JHaP8wm7CRFy1LM7LKa rUSaGbMStuU5lJ2zwsY= X-Google-Smtp-Source: ADKCNb5FiRC4H5OMEnqKVp2S+6yzU/ir0gbgp/8bjI7BzEJkSWmgkMYlF8etko0ooJuO5oJxJIgepg== X-Received: by 10.84.245.134 with SMTP id j6mr14867541pll.283.1505163643764; Mon, 11 Sep 2017 14:00:43 -0700 (PDT) Received: from tfoucu.mtv.corp.google.com ([172.27.196.64]) by smtp.gmail.com with ESMTPSA id s62sm18225127pfe.91.2017.09.11.14.00.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 Sep 2017 14:00:43 -0700 (PDT) From: Thierry Foucu To: ffmpeg-devel@ffmpeg.org Date: Mon, 11 Sep 2017 14:00:16 -0700 Message-Id: <20170911210016.69852-2-tfoucu@gmail.com> X-Mailer: git-send-email 2.14.1.581.gf28d330327-goog In-Reply-To: <20170911210016.69852-1-tfoucu@gmail.com> References: <20170911210016.69852-1-tfoucu@gmail.com> Subject: [FFmpeg-devel] [PATCH] vf_fps: when reading EOF, using current_pts to duplicate the last frame 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" Fix ticket #2674 Tested with examples from ticket 2674. --- libavfilter/vf_fps.c | 40 +++++++++++++++++++++++++++++++++++----- tests/ref/fate/filter-fps | 6 ++++++ tests/ref/fate/filter-fps-r | 4 ++++ tests/ref/fate/m4v-cfr | 1 - 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index 20ccd797d1..c0d68d8972 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -34,6 +34,8 @@ #include "libavutil/opt.h" #include "libavutil/parseutils.h" +#define FF_INTERNAL_FIELDS 1 +#include "framequeue.h" #include "avfilter.h" #include "internal.h" #include "video.h" @@ -137,13 +139,41 @@ 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(ctx->inputs[0]->current_pts - 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 { + /* for delta less or equal to 0, we should drop the frame, + * otherwise, we will have one or more extra frames */ + av_frame_free(&buf); + s->drop++; + } + } } 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 diff --git a/tests/ref/fate/m4v-cfr b/tests/ref/fate/m4v-cfr index 4eee84d01b..e2d02032fe 100644 --- a/tests/ref/fate/m4v-cfr +++ b/tests/ref/fate/m4v-cfr @@ -44,4 +44,3 @@ 0, 38, 38, 1, 115200, 0xf30825d5 0, 39, 39, 1, 115200, 0xe3c944a1 0, 40, 40, 1, 115200, 0x8fec4420 -0, 41, 41, 1, 115200, 0x9381fdab