From patchwork Fri Mar 22 20:28:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 47333 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1014:b0:1a3:ac71:9534 with SMTP id nk20csp163716pzb; Fri, 22 Mar 2024 13:30:28 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUDnF0mcmJJ2zQclmUR4xIv7PSLaRYH+NYZmumTtSS1g0X0Hkqb8cs0S72+7CGYmqXG9M7//e5KwAKq/V5/P/pHcTkb/ixjV2hsyg== X-Google-Smtp-Source: AGHT+IFTtQ2v3oOT8M8nomAtyi6Rx5MkgYXp/B2IDDCOeUgFlMQMYjkpSyQoSTTLiLT2hfEdbetQ X-Received: by 2002:a19:5e41:0:b0:515:9b0f:1235 with SMTP id z1-20020a195e41000000b005159b0f1235mr277338lfi.67.1711139426432; Fri, 22 Mar 2024 13:30:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711139426; cv=none; d=google.com; s=arc-20160816; b=fZ7sz/sbRwc6/bkpt9TraJRMFjtwSHFEOtiGFWnAyyBPTTjpr+vxqQHXPVTHUNnMqN yneuaWyjxU8BPcJ4YODlVRH0PR61LM0PsGiDfrZKUo1VrVvKvLtiodd3UnHMOqx0Udv0 LUfJvrSqcCIWVyiZ8H8Ddi4jFNBEXacjN0tkuUXl6oKlHiHGbBBCW7BIjE8DijPoIBOJ TLFw74CoZ/XfkHxunpa4Ksj7Bjf/sOsb9tdHncjh+8cKLBunfUtp140E1lH7qPE5RX6F EJbBMxIt9R8vexO5xI2TGxvAqvMCCfPkVO3jQyat5wWgtF3OYHXQ54i98Nj7hs7IKIVR 9tIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=FOfEOgjnR75/6gOjeM7EKHNhzP0OlybMdyzHbGEs79M=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=jCebkj5hDyMaHrZCAuCHxgwOIoLAncgGy885bFkcnnFLiH/m6l0VrRAV6ury0z6y7K JZsu7AY8LO0mnq2gBD2u3Q9FloxUq8P++ngzJupSTrv689rXjESuQlVFUnGKNsrFHmjf z5d78PWlhrQ8w2DW0yZSFj/LGtsZofn+EkL29u9joISC38nDnmWVi6IvnMWTx7pWAyex RrBSxwyuP1M1btM2XtkbON7oWl4pkzXFuVNLeqn/Y+HdkmTrsaxFQHb0MY0OB8HQND3p rO6pqRc2/8oix+RP7Imep/KK69BgyOnt8NlwP6LQNJcCqhgmGNPDRXwdPvFLWKvfd99L CgQw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=JvqOgqDk; 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 n25-20020a170906841900b00a46f6bf64bbsi165335ejx.140.2024.03.22.13.30.25; Fri, 22 Mar 2024 13:30:26 -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=@khirnov.net header.s=mail header.b=JvqOgqDk; 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 D0BF868D5C9; Fri, 22 Mar 2024 22:29:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B143068D4D8 for ; Fri, 22 Mar 2024 22:29:01 +0200 (EET) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=JvqOgqDk; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 51AAE4D44 for ; Fri, 22 Mar 2024 21:28:57 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id WxldBx_5hxLp for ; Fri, 22 Mar 2024 21:28:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1711139334; bh=+yrryuV46k/zsrc/PtmVxgKygpsj5MCd+bWBOg4r9YY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=JvqOgqDk6zjwivIS/vHqEIzFFf2LWwWG8aJPANYcfRigyATgA5JBkPwT+YR3pUL1+ 1p5NAUsF2vGwB/JW1XmBPQnWaaFDbmJyeVtcTgpgDj5NZzarmiZGZMp/RxnIY5IJRA u6RsG/f9g2/qDzzZ7cppV/W+bCsLXVdPLWyXWLU3xhTfllSI9kSnpij83KPaFl98A5 G99XaAM8NP11O2jGVlnvzJJXDHy/jyKPbTHfABW43lm2Xq5B2Le1etdzjYgl++XyCP mN/vBf8FEvQSNHRhOZAmADBjGOaNapWHcZHRNzHMIwIkj+eJo0RtKTe6dIV2QQsI8B 1vPSHRalPXAEw== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 6895F4D58 for ; Fri, 22 Mar 2024 21:28:54 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 632333A0C79 for ; Fri, 22 Mar 2024 21:28:45 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 22 Mar 2024 21:28:35 +0100 Message-ID: <20240322202841.31730-6-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240322202841.31730-1-anton@khirnov.net> References: <20240322202841.31730-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/12] fftools/ffmpeg_dec: apply cropping manually X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: XmhoCAFLKSDm lavfi does not require aligned buffers, so we can safely apply top/left cropping by any amount, without passing any special flags to lavc. Longer term, an even better solution would probably be auto-inserting the crop filter (or its hwaccel versions) as needed. Multiple FATE tests no longer need -flags unaligned. --- fftools/ffmpeg_dec.c | 14 ++++++++++++++ tests/fate/h264.mak | 2 +- tests/fate/hevc.mak | 8 ++++---- tests/fate/vvc.mak | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c index b8bfae469f..e3ed0b3978 100644 --- a/fftools/ffmpeg_dec.c +++ b/fftools/ffmpeg_dec.c @@ -51,6 +51,7 @@ typedef struct DecoderPriv { // a combination of DECODER_FLAG_*, provided to dec_open() int flags; + int apply_cropping; enum AVPixelFormat hwaccel_pix_fmt; enum HWAccelID hwaccel_id; @@ -404,6 +405,15 @@ static int video_frame_process(DecoderPriv *dp, AVFrame *frame) if (dp->sar_override.num) frame->sample_aspect_ratio = dp->sar_override; + if (dp->apply_cropping) { + // lavfi does not require aligned frame data + int ret = av_frame_apply_cropping(frame, AV_FRAME_CROP_UNALIGNED); + if (ret < 0) { + av_log(dp, AV_LOG_ERROR, "Error applying decoder cropping\n"); + return ret; + } + } + return 0; } @@ -1214,6 +1224,10 @@ static int dec_open(DecoderPriv *dp, AVDictionary **dec_opts, if (o->flags & DECODER_FLAG_BITEXACT) dp->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT; + // we apply cropping outselves + dp->apply_cropping = dp->dec_ctx->apply_cropping; + dp->dec_ctx->apply_cropping = 0; + if ((ret = avcodec_open2(dp->dec_ctx, codec, NULL)) < 0) { av_log(dp, AV_LOG_ERROR, "Error while opening decoder: %s\n", av_err2str(ret)); diff --git a/tests/fate/h264.mak b/tests/fate/h264.mak index 674054560b..88f06d7b15 100644 --- a/tests/fate/h264.mak +++ b/tests/fate/h264.mak @@ -312,7 +312,7 @@ fate-h264-conformance-ci1_ft_b: CMD = framecrc -i $(TARGET_SAM fate-h264-conformance-ci_mw_d: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CI_MW_D.264 fate-h264-conformance-cvbs3_sony_c: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVBS3_Sony_C.jsv fate-h264-conformance-cvcanlma2_sony_c: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVCANLMA2_Sony_C.jsv -fate-h264-conformance-cvfc1_sony_c: CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/h264-conformance/CVFC1_Sony_C.jsv +fate-h264-conformance-cvfc1_sony_c: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVFC1_Sony_C.jsv fate-h264-conformance-cvfi1_sony_d: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVFI1_Sony_D.jsv fate-h264-conformance-cvfi1_sva_c: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVFI1_SVA_C.264 fate-h264-conformance-cvfi2_sony_h: CMD = framecrc -i $(TARGET_SAMPLES)/h264-conformance/CVFI2_Sony_H.jsv diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak index 4889ee8237..720603c112 100644 --- a/tests/fate/hevc.mak +++ b/tests/fate/hevc.mak @@ -200,8 +200,8 @@ $(HEVC_TESTS_444_8BIT): SCALE_OPTS := -pix_fmt yuv444p $(HEVC_TESTS_10BIT): SCALE_OPTS := -pix_fmt yuv420p10le -vf scale $(HEVC_TESTS_422_10BIT) $(HEVC_TESTS_422_10BIN): SCALE_OPTS := -pix_fmt yuv422p10le -vf scale $(HEVC_TESTS_444_12BIT): SCALE_OPTS := -pix_fmt yuv444p12le -vf scale -fate-hevc-conformance-%: CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/hevc-conformance/$(subst fate-hevc-conformance-,,$(@)).bit $(SCALE_OPTS) -$(HEVC_TESTS_422_10BIN): CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/hevc-conformance/$(subst fate-hevc-conformance-,,$(@)).bin $(SCALE_OPTS) +fate-hevc-conformance-%: CMD = framecrc -i $(TARGET_SAMPLES)/hevc-conformance/$(subst fate-hevc-conformance-,,$(@)).bit $(SCALE_OPTS) +$(HEVC_TESTS_422_10BIN): CMD = framecrc -i $(TARGET_SAMPLES)/hevc-conformance/$(subst fate-hevc-conformance-,,$(@)).bin $(SCALE_OPTS) FATE_HEVC-$(call FRAMECRC, HEVC, HEVC, HEVC_PARSER) += $(HEVC_TESTS_8BIT) $(HEVC_TESTS_444_8BIT) FATE_HEVC-$(call FRAMECRC, HEVC, HEVC, HEVC_PARSER SCALE_FILTER) += \ @@ -252,10 +252,10 @@ FATE_HEVC_FFPROBE-$(call DEMDEC, MOV, HEVC) += fate-hevc-dv-rpu fate-hevc-two-first-slice: CMD = threads=2 framemd5 -i $(TARGET_SAMPLES)/hevc/two_first_slice.mp4 -sws_flags bitexact -t 00:02.00 -an FATE_HEVC-$(call FRAMEMD5, MOV, HEVC) += fate-hevc-two-first-slice -fate-hevc-cabac-tudepth: CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/hevc/cbf_cr_cb_TUDepth_4_circle.h265 -pix_fmt yuv444p +fate-hevc-cabac-tudepth: CMD = framecrc -i $(TARGET_SAMPLES)/hevc/cbf_cr_cb_TUDepth_4_circle.h265 -pix_fmt yuv444p FATE_HEVC-$(call FRAMECRC, HEVC, HEVC) += fate-hevc-cabac-tudepth -fate-hevc-small422chroma: CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/hevc/food.hevc -pix_fmt yuv422p10le -vf scale +fate-hevc-small422chroma: CMD = framecrc -i $(TARGET_SAMPLES)/hevc/food.hevc -pix_fmt yuv422p10le -vf scale FATE_HEVC-$(call FRAMECRC, HEVC, HEVC, HEVC_PARSER SCALE_FILTER) += fate-hevc-small422chroma FATE_SAMPLES_AVCONV += $(FATE_HEVC-yes) diff --git a/tests/fate/vvc.mak b/tests/fate/vvc.mak index f5a45cc4ca..6cb3471b55 100644 --- a/tests/fate/vvc.mak +++ b/tests/fate/vvc.mak @@ -38,7 +38,7 @@ $(foreach VAR,$(FATE_VVC_VARS), $(eval VVC_TESTS_$(VAR) := $(addprefix fate-vvc- $(VVC_TESTS_8BIT): SCALE_OPTS := -pix_fmt yuv420p $(VVC_TESTS_10BIT): SCALE_OPTS := -pix_fmt yuv420p10le -vf scale $(VVC_TESTS_444_10BIT): SCALE_OPTS := -pix_fmt yuv444p10le -vf scale -fate-vvc-conformance-%: CMD = framecrc -flags unaligned -c:v vvc -strict experimental -i $(TARGET_SAMPLES)/vvc-conformance/$(subst fate-vvc-conformance-,,$(@)).bit $(SCALE_OPTS) +fate-vvc-conformance-%: CMD = framecrc -c:v vvc -strict experimental -i $(TARGET_SAMPLES)/vvc-conformance/$(subst fate-vvc-conformance-,,$(@)).bit $(SCALE_OPTS) FATE_VVC-$(call FRAMECRC, VVC, VVC, VVC_PARSER) += $(VVC_TESTS_8BIT) FATE_VVC-$(call FRAMECRC, VVC, VVC, VVC_PARSER SCALE_FILTER) += \