From patchwork Tue Apr 9 22:07:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 12673 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 6F6F0448A83 for ; Wed, 10 Apr 2019 01:07:47 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2FC7268ADDB; Wed, 10 Apr 2019 01:07:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6B25D68AD73 for ; Wed, 10 Apr 2019 01:07:40 +0300 (EEST) Received: by mail-wm1-f51.google.com with SMTP id q16so373414wmj.3 for ; Tue, 09 Apr 2019 15:07:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=FAoZKieaR6q6bkfRCvY2Ik0+NhGcwqZ84Ndd6EuMaY4=; b=1586DOATDmWtgcqbxyG1FQb69RptKlqploGTcZ0dUjla9k4lD1BQ8Dshsq00hTaK6i hDFsPK2jZEtLGUouE2oUmUbLiaddSC/LFdKbrj5lQRthgInt0afgymh0a83NmeQPQ1P7 z4o6Wy7IPm+smOywdDosUQszyi/I4QbFeZaJBZ94rmSK0UoEs8HME06w8uSZx2flTEWd 3rbAEI0OIF7yTzNR/2ighHf48C51PmBadvKRbm9zKJHvAL8oeZmFi31MWY1nYn/oMkFR JK5OUdqY906UbjvEkyXkq4J3UtFfm4IqkRgyALabl7tq+oLk9KjgOvbf+4c0Lg8oVU1s e53w== 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:mime-version :content-transfer-encoding; bh=FAoZKieaR6q6bkfRCvY2Ik0+NhGcwqZ84Ndd6EuMaY4=; b=R5rCwsyXAApcsPGI9q57QbaDJ5H01esvbt8/BJqWHehGhhrBmyp91cWDYpRNSH9wt8 R24y2XV/d7q6B4bn+Lr/Z28Dh6+VpOXOQ1vwNY3OKMZfNSQ+4JAJXrjS+KAl5EoeG4QD r9FkKF6iGQoGF4WJMB14yFvBOMtXmJSI888Bdl/GUq80AYdsXZWVVkADiNoTuOe3MjkN u4KNCpopOYujCPsENO9MSgfJ12QdGRLFUumm1k/Z3AcsjMOGaRt2PgcYLNqd4z52kAkb OC0gG9lKt5Lq4ZpO+3vFSEsvH9o7qNP69C37/W8sOH4bWNbwUztGFwTsjcduqCiMWPge 59KQ== X-Gm-Message-State: APjAAAVxhbq1KaFBfYnqRGU/VpqgtjUYF+5BOnbvxOstPYDHbZOta38v cELwX0bFR4I3zd51TV+LY0fqISBzI7k= X-Google-Smtp-Source: APXvYqxEbPxekEoLlTWnV/H6S2xM2yRO8npdwXwYRlCtzW91zcRDHTIvf6pefKPFTyLvIMIPXjYAxg== X-Received: by 2002:a1c:96d5:: with SMTP id y204mr354527wmd.22.1554847659498; Tue, 09 Apr 2019 15:07:39 -0700 (PDT) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id v6sm41224332wrt.56.2019.04.09.15.07.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Apr 2019 15:07:38 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Tue, 9 Apr 2019 23:07:24 +0100 Message-Id: <20190409220730.29311-1-sw@jkqxz.net> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 1/7] vf_crop: Add support for cropping hardware frames 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set the cropping fields in the AVFrame. --- On 26/03/2019 10:59, Song, Ruiling wrote:> > I think we need to make scale_vaapi evaluate input dimensions considering crop information. What do you think? I agree. But the cropping information is currently carried on the frame, not at any higher level (from the codec context or on the filter link), so we don't have any idea how big the output frames need to be at setup time when we have to set the size on the output link. Making it work requires carrying more complete information through filter setup, similar to the problem with colour range and other properties which aren't reflected in the existing format. (This is on my to-do list.) libavfilter/vf_crop.c | 74 +++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c index 84be4c7d0d..7f6b0f03d3 100644 --- a/libavfilter/vf_crop.c +++ b/libavfilter/vf_crop.c @@ -98,9 +98,17 @@ static int query_formats(AVFilterContext *ctx) for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); - if (!(desc->flags & (AV_PIX_FMT_FLAG_HWACCEL | AV_PIX_FMT_FLAG_BITSTREAM)) && - !((desc->log2_chroma_w || desc->log2_chroma_h) && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) && - (ret = ff_add_format(&formats, fmt)) < 0) + if (desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) + continue; + if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) { + // Not usable if there is any subsampling but the format is + // not planar (e.g. YUYV422). + if ((desc->log2_chroma_w || desc->log2_chroma_h) && + !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) + continue; + } + ret = ff_add_format(&formats, fmt); + if (ret < 0) return ret; } @@ -157,8 +165,14 @@ static int config_input(AVFilterLink *link) s->var_values[VAR_POS] = NAN; av_image_fill_max_pixsteps(s->max_step, NULL, pix_desc); - s->hsub = pix_desc->log2_chroma_w; - s->vsub = pix_desc->log2_chroma_h; + + if (pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { + s->hsub = 1; + s->vsub = 1; + } else { + s->hsub = pix_desc->log2_chroma_w; + s->vsub = pix_desc->log2_chroma_h; + } if ((ret = av_expr_parse_and_eval(&res, (expr = s->w_expr), var_names, s->var_values, @@ -237,9 +251,15 @@ fail_expr: static int config_output(AVFilterLink *link) { CropContext *s = link->src->priv; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); - link->w = s->w; - link->h = s->h; + if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { + // Hardware frames adjust the cropping regions rather than + // changing the frame size. + } else { + link->w = s->w; + link->h = s->h; + } link->sample_aspect_ratio = s->out_sar; return 0; @@ -252,9 +272,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); int i; - frame->width = s->w; - frame->height = s->h; - s->var_values[VAR_N] = link->frame_count_out; s->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ? NAN : frame->pts * av_q2d(link->time_base); @@ -285,22 +302,33 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) (int)s->var_values[VAR_N], s->var_values[VAR_T], s->var_values[VAR_POS], s->x, s->y, s->x+s->w, s->y+s->h); - frame->data[0] += s->y * frame->linesize[0]; - frame->data[0] += s->x * s->max_step[0]; - - if (!(desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & FF_PSEUDOPAL)) { - for (i = 1; i < 3; i ++) { - if (frame->data[i]) { - frame->data[i] += (s->y >> s->vsub) * frame->linesize[i]; - frame->data[i] += (s->x * s->max_step[i]) >> s->hsub; + if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { + frame->crop_top += s->y; + frame->crop_left += s->x; + frame->crop_bottom = frame->height - frame->crop_top - frame->crop_bottom - s->h; + frame->crop_right = frame->width - frame->crop_left - frame->crop_right - s->w; + + } else { + frame->width = s->w; + frame->height = s->h; + + frame->data[0] += s->y * frame->linesize[0]; + frame->data[0] += s->x * s->max_step[0]; + + if (!(desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & FF_PSEUDOPAL)) { + for (i = 1; i < 3; i ++) { + if (frame->data[i]) { + frame->data[i] += (s->y >> s->vsub) * frame->linesize[i]; + frame->data[i] += (s->x * s->max_step[i]) >> s->hsub; + } } } - } - /* alpha plane */ - if (frame->data[3]) { - frame->data[3] += s->y * frame->linesize[3]; - frame->data[3] += s->x * s->max_step[3]; + /* alpha plane */ + if (frame->data[3]) { + frame->data[3] += s->y * frame->linesize[3]; + frame->data[3] += s->x * s->max_step[3]; + } } return ff_filter_frame(link->dst->outputs[0], frame);