From patchwork Thu Jun 11 16:12:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 20292 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 E7EAD449D39 for ; Thu, 11 Jun 2020 19:43:31 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C939A68B56F; Thu, 11 Jun 2020 19:43:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f194.google.com (mail-lj1-f194.google.com [209.85.208.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A8BF568B4FD for ; Thu, 11 Jun 2020 19:43:24 +0300 (EEST) Received: by mail-lj1-f194.google.com with SMTP id 9so7721141ljc.8 for ; Thu, 11 Jun 2020 09:43:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=+qWxMZPfhcjbf5aX6MR9fUooOzh8T0JT4ASTLD6Dt2Q=; b=S3fzDcmP0NWRK+7/eeanHIG/PRUvrJWfeueNLHJUVGurzgRJyaqg4F97X5qGQInP2w 5jvHujD2sVhAHlbGxMUn0V1vqV17f83aRM0/SVT4DR/mZr4EW7/0meV7sYoDLz6xGA78 sx8BD/B2YHewbgh6bZZLwGj/r5sQUJfmAGbShYR4onrmgPHJxHEkt0EbbvdjmdWGkoYf aDTGxg0Pki5X41bU4Yu38kJ6ZKwZXttswWVgU9+tOlanU0it7zrCyrxOV0Z7kzvQrnVY +13nVobvBdPBjAN8gObV3/ta4FltVjOx+XafQakcs5shsodd19oP6dP6ZzsVfmg7hATu YdUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=+qWxMZPfhcjbf5aX6MR9fUooOzh8T0JT4ASTLD6Dt2Q=; b=O3JZhTfv07R9ai3vcA0QPsWWq7Ja+RAMMtHqTL3v3/zOLGzU7DiH/+Jm+5U77MRxfX 2X1pBWouEu5niyWZUCMBcvii2NTTFK0MtOJbYQx2SlLGRjBbKdoSjmTvre/T9IDi3rhf 4/e025CK+iJO5CCWkWJSFb0li5C94Nq9bYWq/JpCTsJVnhtW0TfAUl3wDii4qy3pMAyT HRBQlWrT9U0L/aQqBZpI/IsHPMJjtfXs6zO1ll4rMfBo3jn2NwAlBY1JMAGgEXPxdQnh fFIRUMIrKzYcfYx8m/5PVQqtWkb+U3gM6nOjvmLjM4XIR5MLz1tckJcMy2F2Y08j/AIW YBBg== X-Gm-Message-State: AOAM531CLw3GJ5gezfMVb6vXWkv8PVio+bnoj6Svd2lUbmeH2aoBYVe/ dHHAYTm3d6gTUVEwvodTGYUeyw7/mAY= X-Google-Smtp-Source: ABdhPJzBwXRWGcCZ+iHLi6H0+m/4EHYC3cuMqUDxG7lqItVioyNwmC9rZkjL3K1tGTUXfblf7NnimQ== X-Received: by 2002:a5d:4d89:: with SMTP id b9mr10893087wru.210.1591891958580; Thu, 11 Jun 2020 09:12:38 -0700 (PDT) Received: from localhost.localdomain ([37.244.249.74]) by smtp.gmail.com with ESMTPSA id 104sm6074960wrl.25.2020.06.11.09.12.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 09:12:37 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Jun 2020 18:12:22 +0200 Message-Id: <20200611161227.5622-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611161227.5622-1-onemda@gmail.com> References: <20200611161227.5622-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/7] avfilter: add ff_inlink_peek_samples and ff_inlink_skip samples 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavfilter/avfilter.c | 61 +++++++++++++++++++++++++++++++++++++----- libavfilter/filters.h | 17 ++++++++++++ 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index dd8074e462..b1db92de4b 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -1147,6 +1147,7 @@ static int samples_ready(AVFilterLink *link, unsigned min) } static int take_samples(AVFilterLink *link, unsigned min, unsigned max, + unsigned peek_samples, AVFrame **rframe) { AVFrame *frame0, *frame, *buf; @@ -1158,7 +1159,10 @@ static int take_samples(AVFilterLink *link, unsigned min, unsigned max, av_assert1(samples_ready(link, link->min_samples)); frame0 = frame = ff_framequeue_peek(&link->fifo, 0); if (!link->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) { - *rframe = ff_framequeue_take(&link->fifo); + if (peek_samples) + *rframe = av_frame_clone(frame); + else + *rframe = ff_framequeue_take(&link->fifo); return 0; } nb_frames = 0; @@ -1188,18 +1192,20 @@ static int take_samples(AVFilterLink *link, unsigned min, unsigned max, p = 0; for (i = 0; i < nb_frames; i++) { - frame = ff_framequeue_take(&link->fifo); + frame = peek_samples ? ff_framequeue_peek(&link->fifo, i) : ff_framequeue_take(&link->fifo); av_samples_copy(buf->extended_data, frame->extended_data, p, 0, frame->nb_samples, link->channels, link->format); p += frame->nb_samples; - av_frame_free(&frame); + if (!peek_samples) + av_frame_free(&frame); } if (p < nb_samples) { unsigned n = nb_samples - p; - frame = ff_framequeue_peek(&link->fifo, 0); + frame = ff_framequeue_peek(&link->fifo, peek_samples ? i : 0); av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n, link->channels, link->format); - ff_framequeue_skip_samples(&link->fifo, n, link->time_base); + if (!peek_samples) + ff_framequeue_skip_samples(&link->fifo, n, link->time_base); } *rframe = buf; @@ -1520,7 +1526,7 @@ int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, return 0; if (link->status_in) min = FFMIN(min, ff_framequeue_queued_samples(&link->fifo)); - ret = take_samples(link, min, max, &frame); + ret = take_samples(link, min, max, 0, &frame); if (ret < 0) return ret; consume_update(link, frame); @@ -1528,6 +1534,49 @@ int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, return 1; } +int ff_inlink_peek_samples(AVFilterLink *link, unsigned nb_samples, + AVFrame **rframe) +{ + AVFrame *frame; + int ret; + + av_assert1(nb_samples); + *rframe = NULL; + if (!ff_inlink_check_available_samples(link, nb_samples)) + return 0; + if (link->status_in) + nb_samples = FFMIN(nb_samples, ff_framequeue_queued_samples(&link->fifo)); + ret = take_samples(link, nb_samples, nb_samples, 1, &frame); + if (ret < 0) + return ret; + *rframe = frame; + return !!frame; +} + +void ff_inlink_skip_samples(AVFilterLink *link, unsigned skip_samples) +{ + skip_samples = FFMIN(skip_samples, ff_framequeue_queued_samples(&link->fifo)); + + while (skip_samples > 0) { + AVFrame *frame = ff_inlink_peek_frame(link, 0); + if (skip_samples >= frame->nb_samples) { + frame = ff_framequeue_take(&link->fifo); + skip_samples -= frame->nb_samples; + av_frame_free(&frame); + } else { + break; + } + } + + if (skip_samples) + ff_framequeue_skip_samples(&link->fifo, skip_samples, link->time_base); + + if (ff_inlink_queued_frames(link)) { + AVFrame *frame = ff_inlink_peek_frame(link, 0); + consume_update(link, frame); + } +} + AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx) { return ff_framequeue_peek(&link->fifo, idx); diff --git a/libavfilter/filters.h b/libavfilter/filters.h index 1157755403..7dc0b35981 100644 --- a/libavfilter/filters.h +++ b/libavfilter/filters.h @@ -115,6 +115,23 @@ int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe); int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe); +/** + * Peek samples from the link's FIFO. + * + * @return >0 if a samples are available, + * 0 and set rframe to NULL if no samples are available, + * or AVERROR code + */ +int ff_inlink_peek_samples(AVFilterLink *link, unsigned nb_samples, + AVFrame **rframe); + +/** + * Skip samples from the link's FIFO. + * + * @note May trigger process_command() and/or update is_disabled. + */ +void ff_inlink_skip_samples(AVFilterLink *link, unsigned skip); + /** * Access a frame in the link fifo without consuming it. * The first frame is numbered 0; the designated frame must exist.