From patchwork Sun Mar 11 22:41:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 7923 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp974322jad; Sun, 11 Mar 2018 15:42:49 -0700 (PDT) X-Google-Smtp-Source: AG47ELu6Tq28qCv7Owj3JDXQZKQob+9Oo0bUv8nKG3Iu6piMey/w/Ma287sqt2mEmOIX03uajzTO X-Received: by 10.223.160.110 with SMTP id l43mr2354875wrl.264.1520808169787; Sun, 11 Mar 2018 15:42:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520808169; cv=none; d=google.com; s=arc-20160816; b=V2eeoCCE0D9JiD08q4PaV/oAuyFS1VLsT9id7zE8JDHkk3YcFmv0hjSBJ34HL0hdO6 JwUZWDWfp4hkjdFRKXHSZQ5T8eMGHKrXrzJZOmckZRrv9SsS0PMtC9++8wuDTB/vvo7x 2Yax1AUTDUYL9wvEjedT7Z03qyRqlbtOHujOqYBiRIoSH7kx59ViZznnCZfy0nhRQWfQ YlAbxrcck+0pTBHaDWpzYmFIYYJGw3myozRqxVNcLX1c1Rz4TK8Y/hRNxz+GDvij058t PFeqQfcUXQOdvdwFluAFT57KuU9Stx9IiYuuaSjcxt1wYpiJDkBoyuBtdXNpVYMwfH/L RMBw== 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: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=TrSahEIP1U7J9jtoLyrp+JJm5/BCqq89QaUIUJ0bHis=; b=Yoz5Awp4m4b7NdfjSkIRYbuMtLxDbNjFGBM0TcRKtqvoMfnuUsmZzq5K6Nneu0sp4o z06iULatxt052AB0mH6u4PVF1/+mWVlkpQXs+NqMmcejKGf0XcFWb7jAdw3Kbj75Pdy7 mUopmZxV4jV2CqcKzeLd8PnZoD11DjQDb9xrp/mQAdl2XvdKRoVYVc5Z6WGwPkKDy8x6 EmVKhghgrpG4yzyvC5xRLLkzamNd9LQrWUIJ+i7HJrFDf23LWCOb1QlHiaT8avrY0Ytz cmN2ltc+FchQvXJadSi31rloC0Q0GV4+BuOs+ornotaVC5XdnzrhZk/OH+us1ZqzAY8Q Okdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=V8GOcuXM; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v18si784248wrb.47.2018.03.11.15.42.49; Sun, 11 Mar 2018 15:42:49 -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=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=V8GOcuXM; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9650768A273; Mon, 12 Mar 2018 00:42:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E329C689C73 for ; Mon, 12 Mar 2018 00:41:57 +0200 (EET) Received: by mail-wm0-f68.google.com with SMTP id z9so12691929wmb.3 for ; Sun, 11 Mar 2018 15:42:08 -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:in-reply-to:references; bh=eoMXJJlmk/ZrM60Lfdi2uw2Tt1j1e10WyA3AV8QaoG8=; b=V8GOcuXMdreiL48llpQHnfUXRuhyw/WTnAg/MjZ9fk6vW5Tu8AAfCQ2nQ9XVePfSi6 GUy+vi/GYCa4PGec0Jn8pIaQlMIBo9ViSKFgndfwb7odRZti2luC0Hm6O/JRuRjVi/en jQPUe59VituVbj7IUqULR9QXggBChmx9gEVL5RWiUQ5n9VaU+YRDWVqSKftdMR9l/6mN 3HRSJS0h7BXBluDmkQ6uYt1HiVbFSWAVITj8fpqq6/z9mvsUIPMIEq81xk5PEdYFZuDb DyBh2amV7LGVvR7kX/i3OEhO6bP/lmhA1Xp9fQR1zDjWOZcKEvRniEJ25LI/vLcG0GgA L4Nw== 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=eoMXJJlmk/ZrM60Lfdi2uw2Tt1j1e10WyA3AV8QaoG8=; b=iFrTbqkUil7RcDNMsNEIfrytCXUmOppdcQnEEOR8NQWsrXZ9P61HSGSoDEPrr7tuwg FWiIJ2OF9Z5yTJAPggfS3nHvRV66E1tsJVWnbIvWXNUKtfIClJc+43wr7fPcjG+07kCd s0DR2N2V4UgK3r3yT8+gM+EQE99urkbFJjL0bG/LAEmEIjoZYAOD3YNJAVDLne9pTgsg Snc6FeytgIrK60c5ZV7foHIy7oz8uyVoY3iaCXmmxxTpYewOcS1IIfqbjIPvh/90TMgs vL+2U/PyiKhC2B6zYl+uRC1kSaaLj7tGVOZzn80B2jvu2UpGiYumR8yKBMWtsTGu7qxZ qlmQ== X-Gm-Message-State: AElRT7E1dUFuZ7LWAlqAodIJ9CpsyCb4UqhBsqZMf971meIGwe/29pRJ 5VacWDtcUEBZEAMIiaDcnY5ZIeSr X-Received: by 10.28.62.16 with SMTP id l16mr4221526wma.54.1520808127609; Sun, 11 Mar 2018 15:42:07 -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 d5sm5317163wma.18.2018.03.11.15.42.06 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Mar 2018 15:42:07 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 11 Mar 2018 22:41:54 +0000 Message-Id: <20180311224156.23986-5-sw@jkqxz.net> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180311224156.23986-1-sw@jkqxz.net> References: <20180311224156.23986-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 5/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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set the cropping fields in the AVFrame. --- libavfilter/vf_crop.c | 61 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c index 0fdc4949e3..0b1b8a048b 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, @@ -285,22 +299,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 & AV_PIX_FMT_FLAG_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 & AV_PIX_FMT_FLAG_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);