From patchwork Mon Jan 22 17:46:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45717 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130153pzf; Mon, 22 Jan 2024 09:47:00 -0800 (PST) X-Google-Smtp-Source: AGHT+IFxbnCrOtQn9F5+uWiOlLhm9mdmaQIRpmR+Nc5yUDD7Eu1vjzchoAMKfmHeMNT9HtKccbgK X-Received: by 2002:aa7:c54a:0:b0:55a:4c93:5f18 with SMTP id s10-20020aa7c54a000000b0055a4c935f18mr170566edr.56.1705945620292; Mon, 22 Jan 2024 09:47:00 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g5-20020a056402320500b0055a56fa81d0si4098724eda.378.2024.01.22.09.46.59; Mon, 22 Jan 2024 09:47:00 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=d2XMFN6c; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6B42F68CFA4; Mon, 22 Jan 2024 19:46:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2066.outbound.protection.outlook.com [40.92.99.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E8C1268C99B for ; Mon, 22 Jan 2024 19:46:48 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=APKbDDpvdkC6HGcQqEYlQ52VA/zmZBARvnE+Bok9wpSOb3i6o4744JJ2I8GlEpZpFM57Q5mNy7TiQODvMd9w22O6sRDFXjz0ekoczF/4h6VLkueHrgEbjiYKcDxNyY2rA35F5GQxtXu8X6ecLqIBI1dyqWQv9Wsgd1PySuF6f5YTQjQG6p2n8QSiZeVHGMxCbUsdHtYiM7KczWP4pXTNnjP11Kqp3+CeLtu0guWWDbkjR15uAcANZey8tr3/Mn6X+28q/zCQNk6MkQ106eHwnahjw8m9n7T9sOHD6IR60lF5I647eac1Ay1UarKt5onicPsrlW3sUwei15Dc/7X29w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+kDushbViWZ6mfCHewVHfueru+uP06YgpwwE43O4dCU=; b=AvdCg2pdSXQBf8Rv4RVsMnrGhIBg0G/VB2mEX9yZF4W4cYUq1JsvsJ74pwMKDUo5bJ5BcwUABaSqA5Am0Ip4sKXHOyoFaCzhPr/vhGbRT0eFd7GUHRbRKff6wM3mzcx1OkVz7l8Q2s+1gKbT8dxRvRwabwd3tDHBe50g1t2uVK3S8FBJqQJdHrBzR8OrNkVzuN6ORH2doGfIMBY3WMSDjRewL2+zslnd6jsM56uNWthjUGGL4/C0NBPcWWBl7QV3B8KYnOAKNvdhIN5jn6THI2BFm6GMlm1MSNJpPIsSwIKtvcWvhzcC+f+QKGj+6IgVdyD25PhMny/0vwMiDfEACg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+kDushbViWZ6mfCHewVHfueru+uP06YgpwwE43O4dCU=; b=d2XMFN6cNDae5Z1EKATYW/evH63F7wHOBsjNMY4P7mAsOCNK2FBTOzucWiiTJiXGFd8NZAs1j5PMei99Zfe4FX0HqeRjCBLR1ZBbr3doh5JDln3mJCidKKmlptN9rFtB9kH1lgV6KHdS96LdRGfsZPU1D0KCRf1oYYiljKd441LUepdX5tw6CZwdyLgISZX2s20lEfO+k9G6qNQf5BhzwEAiD8FlGwGu0VtL92nidjNftW/BmmMWus5GuSLL7vuuPa3BuOdf0EOtm/KxTuzJNLCnYcIT6UX9Mr+h8x5DYgA2TxgfyqD/J7dyUiSrsm7xxiyh93tTmqbO5JAqn9y8Zg== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:44 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:44 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:21 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [vv74KbSUC80N8mAfp+V92DhiZMUnbE0Q] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-1-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: a8963784-1817-4301-ab12-08dc1b7218d5 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yqYFi3gpKOvWG3Vt4LoRwjvreLIJ4gtQvZ6EYNiuTLy1C2UsIm0sdbJwIwni6qKEs7/nuSG8oVZF5GiGSG2M47WzkjjVP/9i6QCqo6nTwcIyEmQc2/TefTKroUwqub65HNHNw+7XnzaxH96RejYEIv0JwvmoZ2KJIW1USqT3wBJy7sO/+e72rAXaM3SqA+vyHQ65CnQ8WLleqwo2hGLvmZZUKzUkj13RokXhLW/mKWbRgaLhH0ocCLOTV8mIQM7FxOj+YXU9LLfHpLTjWZH74AHza1OaKgAndGAzlegKRRE/k5hmnGJiiA8GUlJ9Pn/GZbQpyxkUcMlRtayJT728MFMmT/Na2vTTTpg0VQUvSGL8es5XiyY6gTKhJI5UKcYKABuMQo145WQxBGrf5e9OsKggRDYrbgmdggRQfb66uJqUOl1pEYcatakU5ZA4i4s1pJJrSu2OWXFVh9K6QHeYjEoh9c/vXHHIIr9d7n9GJZFhyr6JWt7UrUdB5CHdo3U9NqSsaBq4NRRW3Lhx1eMXTJTt8hrTXqBqlYWsU6tfincDL7xJZBEiTdgLoysDtCXOH1wLjbIz7rfh1lowC59hKD0QLCozpQDoGEilN+VrO56UGNAFKM5SPCWQogKJt1O0 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GH6EYQ1RP3vewM8xUlqjzxsjA8R7otPNYBHwcMrpLGZYD9jmixL5Da3/tvEwbUJW5nDuzybOJJyHS1SZ9SIDFYDGNutEUC/rfvqgVa+p+WOckOXLWIs3cPAfN5gpENx2VOS/jRVlSP5/88mYKl7QWbI+93CyA+kGfjTnDfyFQInX4UpHhVTlpGlwdcNniifuVn2qSaUUaraqQWw6f0nhSeerIGOkcpsjSd4XCME5kSUcgwC/g1R4s66rzAqFu1KGNnWT896oUL+AnIBo0mlaqR6eP7Vd6C8Ai196b9lQOD+E+fA9v7IU5HsZ2Pu5tESiPkbom7EEMS20zj9nuQSZxZk7uD+myGHTBvwexPKpSQSv+jMzQetfEj5K3YAVl7c1itEOFkVjrGu4bj0j6cX+zV8SD3zE+ME8LlGQwGSzvezaJpzKcKHsGoZfkfZ4xt3BZFm+/x/i06aEzunNQ6zY5wtJLyPEdXuu9UvNOfUbD24y9GcPqBVSc18Dm1kXUCIgwPeTEp4G7qapdQmlIPABhpCL+MPjdIiaRrH5l7VBnD6Cuk9PvOikBBAlzruKWxPQMvBa77q3xTgtf081Hn+hJGVk+I6j95CHxUip6H8oTWl3v70Dan6Mrs6R13vZIXhWZzVu58JFy+Q/7HtlMmtVLNRdHeAjmtCk2CDNzXGRPYM7DJTABGkQ+jTNjo6ov+3cqmxXvrjlJ7v/KlBMt1wVzut+zoQaKeqiJ3j3xjqo7g0EfXN875/4ojT+WxXyUAfEdZi+FTGtYA/0dEln+NH5dDT8OFvcimYMW2ArhdnSZUj56J7djNsSEV+AvxbDhFThklbC9GY43VVcGsbdWCWR2WAY5rm/ckMabU7zsL2KyzFyYkL5weFH+2FTjdqVjjEEPmFpekmmpXa2XzAIeXUPtrT9BVOdvfpqkteGPTRYHaBo1ZNNbtzG/wGBA0xoW6RI903/1XK1Tg0kE7xqS0/KRcAIhkhbKT/mBpoY+zUEPNpy9gSvtcBzDmkeaolVMw5Cejo4NLij4QfC7T6whtBZBbWZxv/Vz1A5puJw8tKZFAeSi5Ow1ZP9cIbR3RHotoqMoj4CpmxIoBQ/xAnAA7vq9C30SmAfsQvyNapaBGmAg1PXHOPWISf5ejdtFEGbe/JRZF06Yl9OaLpRm19LiqfugHnSawc6gKmDtK/I09MDtgWSXPl/w6d44WJVZe7gQ639zRFz0FCDK1zeYOnrtDroWuyBwPeQnmZe9mwSFT7WffA= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a8963784-1817-4301-ab12-08dc1b7218d5 X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:43.9668 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 1/8] avcodec/vvc/vvc_inter_template: move put/put_luma/put_chroma template to h2656_inter_template.c 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KOUaDCfkmK3h From: Wu Jianhua Signed-off-by: Wu Jianhua --- libavcodec/h26x/h2656_inter_template.c | 577 +++++++++++++++++++++++++ libavcodec/vvc/vvc_inter_template.c | 559 +----------------------- 2 files changed, 578 insertions(+), 558 deletions(-) create mode 100644 libavcodec/h26x/h2656_inter_template.c diff --git a/libavcodec/h26x/h2656_inter_template.c b/libavcodec/h26x/h2656_inter_template.c new file mode 100644 index 0000000000..864f6c7e7d --- /dev/null +++ b/libavcodec/h26x/h2656_inter_template.c @@ -0,0 +1,577 @@ +/* + * inter prediction template for HEVC/VVC + * + * Copyright (C) 2022 Nuo Mi + * Copyright (C) 2024 Wu Jianhua + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define CHROMA_EXTRA_BEFORE 1 +#define CHROMA_EXTRA 3 +#define LUMA_EXTRA_BEFORE 3 +#define LUMA_EXTRA 7 + +static void FUNC(put_pixels)(int16_t *dst, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = src[x] << (14 - BIT_DEPTH); + src += src_stride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_uni_pixels)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, const int height, + const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + + for (int y = 0; y < height; y++) { + memcpy(dst, src, width * sizeof(pixel)); + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_w_pixels)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, const int height, + const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, + const int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + const int ox = _ox * (1 << (BIT_DEPTH - 8)); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + const int v = (src[x] << (14 - BIT_DEPTH)); + dst[x] = av_clip_pixel(((v * wx + offset) >> shift) + ox); + } + src += src_stride; + dst += dst_stride; + } +} + +#define LUMA_FILTER(src, stride) \ + (filter[0] * src[x - 3 * stride] + \ + filter[1] * src[x - 2 * stride] + \ + filter[2] * src[x - stride] + \ + filter[3] * src[x ] + \ + filter[4] * src[x + stride] + \ + filter[5] * src[x + 2 * stride] + \ + filter[6] * src[x + 3 * stride] + \ + filter[7] * src[x + 4 * stride]) + +static void FUNC(put_luma_h)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel*)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = hf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_luma_v)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (pixel*)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = vf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); + src += src_stride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_luma_hv)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel*)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = hf; + + src -= LUMA_EXTRA_BEFORE * src_stride; + for (int y = 0; y < height + LUMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6; + tmp += MAX_PB_SIZE; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_uni_luma_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + const int val = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + dst[x] = av_clip_pixel((val + offset) >> shift); + } + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_luma_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = vf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + const int val = LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); + dst[x] = av_clip_pixel((val + offset) >> shift); + } + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_luma_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + src -= LUMA_EXTRA_BEFORE * src_stride; + for (int y = 0; y < height + LUMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + const int val = LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6; + dst[x] = av_clip_pixel((val + offset) >> shift); + } + tmp += MAX_PB_SIZE; + dst += dst_stride; + } + +} + +static void FUNC(put_uni_luma_w_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, int height, + const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, + const int width) +{ + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int ox = _ox * (1 << (BIT_DEPTH - 8)); + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel((((LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_luma_w_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, const int height, + const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, + const int width) +{ + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = vf; + const int ox = _ox * (1 << (BIT_DEPTH - 8)); + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel((((LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_luma_w_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, const int height, const int denom, + const int wx, const int _ox, const int8_t *hf, const int8_t *vf, const int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel*)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int ox = _ox * (1 << (BIT_DEPTH - 8)); + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + src -= LUMA_EXTRA_BEFORE * src_stride; + for (int y = 0; y < height + LUMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel((((LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); + tmp += MAX_PB_SIZE; + dst += dst_stride; + } +} + +#define CHROMA_FILTER(src, stride) \ + (filter[0] * src[x - stride] + \ + filter[1] * src[x] + \ + filter[2] * src[x + stride] + \ + filter[3] * src[x + 2 * stride]) + +static void FUNC(put_chroma_h)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = hf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_chroma_v)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = vf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); + src += src_stride; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_chroma_hv)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel *)_src; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const int8_t *filter = hf; + + src -= CHROMA_EXTRA_BEFORE * src_stride; + + for (int y = 0; y < height + CHROMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6; + tmp += MAX_PB_SIZE; + dst += MAX_PB_SIZE; + } +} + +static void FUNC(put_uni_chroma_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel(((CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_chroma_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = vf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel(((CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) + offset) >> shift); + src += src_stride; + dst += dst_stride; + } +} + +static void FUNC(put_uni_chroma_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + src -= CHROMA_EXTRA_BEFORE * src_stride; + + for (int y = 0; y < height + CHROMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel(((CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); + tmp += MAX_PB_SIZE; + dst += dst_stride; + } +} + +static void FUNC(put_uni_chroma_w_h)(uint8_t *_dst, ptrdiff_t _dst_stride, + const uint8_t *_src, ptrdiff_t _src_stride, int height, int denom, int wx, int ox, + const int8_t *hf, const int8_t *vf, int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + dst[x] = av_clip_pixel((((CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + } + dst += dst_stride; + src += src_stride; + } +} + +static void FUNC(put_uni_chroma_w_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, + const uint8_t *_src, const ptrdiff_t _src_stride, const int height, + const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, + const int width) +{ + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = vf; + const int shift = denom + 14 - BIT_DEPTH; + const int ox = _ox * (1 << (BIT_DEPTH - 8)); +#if BIT_DEPTH < 14 + int offset = 1 << (shift - 1); +#else + int offset = 0; +#endif + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + dst[x] = av_clip_pixel((((CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); + } + dst += dst_stride; + src += src_stride; + } +} + +static void FUNC(put_uni_chroma_w_hv)(uint8_t *_dst, ptrdiff_t _dst_stride, + const uint8_t *_src, ptrdiff_t _src_stride, int height, int denom, int wx, int ox, + const int8_t *hf, const int8_t *vf, int width) +{ + int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; + int16_t *tmp = tmp_array; + const pixel *src = (const pixel *)_src; + pixel *dst = (pixel *)_dst; + const ptrdiff_t src_stride = _src_stride / sizeof(pixel); + const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); + const int8_t *filter = hf; + const int shift = denom + 14 - BIT_DEPTH; +#if BIT_DEPTH < 14 + const int offset = 1 << (shift - 1); +#else + const int offset = 0; +#endif + + src -= CHROMA_EXTRA_BEFORE * src_stride; + + for (int y = 0; y < height + CHROMA_EXTRA; y++) { + for (int x = 0; x < width; x++) + tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); + src += src_stride; + tmp += MAX_PB_SIZE; + } + + tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; + filter = vf; + + ox = ox * (1 << (BIT_DEPTH - 8)); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + dst[x] = av_clip_pixel((((CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); + tmp += MAX_PB_SIZE; + dst += dst_stride; + } +} diff --git a/libavcodec/vvc/vvc_inter_template.c b/libavcodec/vvc/vvc_inter_template.c index b67b66a2dc..9a9284a9a5 100644 --- a/libavcodec/vvc/vvc_inter_template.c +++ b/libavcodec/vvc/vvc_inter_template.c @@ -20,564 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -static void FUNC(put_pixels)(int16_t *dst, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = src[x] << (14 - BIT_DEPTH); - src += src_stride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_uni_pixels)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, const int height, - const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - - for (int y = 0; y < height; y++) { - memcpy(dst, src, width * sizeof(pixel)); - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_w_pixels)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, const int height, - const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, - const int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - const int ox = _ox * (1 << (BIT_DEPTH - 8)); - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - const int v = (src[x] << (14 - BIT_DEPTH)); - dst[x] = av_clip_pixel(((v * wx + offset) >> shift) + ox); - } - src += src_stride; - dst += dst_stride; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -#define LUMA_FILTER(src, stride) \ - (filter[0] * src[x - 3 * stride] + \ - filter[1] * src[x - 2 * stride] + \ - filter[2] * src[x - stride] + \ - filter[3] * src[x ] + \ - filter[4] * src[x + stride] + \ - filter[5] * src[x + 2 * stride] + \ - filter[6] * src[x + 3 * stride] + \ - filter[7] * src[x + 4 * stride]) - -static void FUNC(put_luma_h)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel*)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = hf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_luma_v)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (pixel*)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = vf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); - src += src_stride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_luma_hv)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel*)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = hf; - - src -= LUMA_EXTRA_BEFORE * src_stride; - for (int y = 0; y < height + LUMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6; - tmp += MAX_PB_SIZE; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_uni_luma_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - const int val = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - dst[x] = av_clip_pixel((val + offset) >> shift); - } - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_luma_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = vf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - const int val = LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); - dst[x] = av_clip_pixel((val + offset) >> shift); - } - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_luma_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - src -= LUMA_EXTRA_BEFORE * src_stride; - for (int y = 0; y < height + LUMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - const int val = LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6; - dst[x] = av_clip_pixel((val + offset) >> shift); - } - tmp += MAX_PB_SIZE; - dst += dst_stride; - } - -} - -static void FUNC(put_uni_luma_w_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, int height, - const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, - const int width) -{ - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int ox = _ox * (1 << (BIT_DEPTH - 8)); - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel((((LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_luma_w_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, const int height, - const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, - const int width) -{ - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = vf; - const int ox = _ox * (1 << (BIT_DEPTH - 8)); - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel((((LUMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_luma_w_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, const int height, const int denom, - const int wx, const int _ox, const int8_t *hf, const int8_t *vf, const int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + LUMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel*)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int ox = _ox * (1 << (BIT_DEPTH - 8)); - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - src -= LUMA_EXTRA_BEFORE * src_stride; - for (int y = 0; y < height + LUMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = LUMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + LUMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel((((LUMA_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); - tmp += MAX_PB_SIZE; - dst += dst_stride; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -#define CHROMA_FILTER(src, stride) \ - (filter[0] * src[x - stride] + \ - filter[1] * src[x] + \ - filter[2] * src[x + stride] + \ - filter[3] * src[x + 2 * stride]) - -static void FUNC(put_chroma_h)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = hf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_chroma_v)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = vf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8); - src += src_stride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_chroma_hv)(int16_t *dst, const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel *)_src; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const int8_t *filter = hf; - - src -= CHROMA_EXTRA_BEFORE * src_stride; - - for (int y = 0; y < height + CHROMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6; - tmp += MAX_PB_SIZE; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_uni_chroma_h)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel(((CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_chroma_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = vf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel(((CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(put_uni_chroma_hv)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, - const int height, const int8_t *hf, const int8_t *vf, const int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - src -= CHROMA_EXTRA_BEFORE * src_stride; - - for (int y = 0; y < height + CHROMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel(((CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); - tmp += MAX_PB_SIZE; - dst += dst_stride; - } -} - -static void FUNC(put_uni_chroma_w_h)(uint8_t *_dst, ptrdiff_t _dst_stride, - const uint8_t *_src, ptrdiff_t _src_stride, int height, int denom, int wx, int ox, - const int8_t *hf, const int8_t *vf, int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - dst[x] = av_clip_pixel((((CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - } - dst += dst_stride; - src += src_stride; - } -} - -static void FUNC(put_uni_chroma_w_v)(uint8_t *_dst, const ptrdiff_t _dst_stride, - const uint8_t *_src, const ptrdiff_t _src_stride, const int height, - const int denom, const int wx, const int _ox, const int8_t *hf, const int8_t *vf, - const int width) -{ - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = vf; - const int shift = denom + 14 - BIT_DEPTH; - const int ox = _ox * (1 << (BIT_DEPTH - 8)); -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - dst[x] = av_clip_pixel((((CHROMA_FILTER(src, src_stride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - } - dst += dst_stride; - src += src_stride; - } -} - -static void FUNC(put_uni_chroma_w_hv)(uint8_t *_dst, ptrdiff_t _dst_stride, - const uint8_t *_src, ptrdiff_t _src_stride, int height, int denom, int wx, int ox, - const int8_t *hf, const int8_t *vf, int width) -{ - int16_t tmp_array[(MAX_PB_SIZE + CHROMA_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - const pixel *src = (const pixel *)_src; - pixel *dst = (pixel *)_dst; - const ptrdiff_t src_stride = _src_stride / sizeof(pixel); - const ptrdiff_t dst_stride = _dst_stride / sizeof(pixel); - const int8_t *filter = hf; - const int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - const int offset = 1 << (shift - 1); -#else - const int offset = 0; -#endif - - src -= CHROMA_EXTRA_BEFORE * src_stride; - - for (int y = 0; y < height + CHROMA_EXTRA; y++) { - for (int x = 0; x < width; x++) - tmp[x] = CHROMA_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += src_stride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + CHROMA_EXTRA_BEFORE * MAX_PB_SIZE; - filter = vf; - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - dst[x] = av_clip_pixel((((CHROMA_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); - tmp += MAX_PB_SIZE; - dst += dst_stride; - } -} +#include "libavcodec/h26x/h2656_inter_template.c" static void FUNC(avg)(uint8_t *_dst, const ptrdiff_t _dst_stride, const int16_t *src0, const int16_t *src1, const int width, const int height) From patchwork Mon Jan 22 17:46:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45719 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130313pzf; Mon, 22 Jan 2024 09:47:21 -0800 (PST) X-Google-Smtp-Source: AGHT+IErDkjFQP+9iMlhJped3jnx2/PWQeUcHIQWr4hILUtYO/fUiDzkFaSdVogTryBAGEBFOck2 X-Received: by 2002:aa7:d859:0:b0:55c:51bf:b10b with SMTP id f25-20020aa7d859000000b0055c51bfb10bmr116068eds.83.1705945641236; Mon, 22 Jan 2024 09:47:21 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id en13-20020a056402528d00b005581bbd7314si11580390edb.130.2024.01.22.09.47.20; Mon, 22 Jan 2024 09:47:21 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=ZjiUESH9; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DA90768D0BD; Mon, 22 Jan 2024 19:47:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2017.outbound.protection.outlook.com [40.92.99.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 742B868D083 for ; Mon, 22 Jan 2024 19:46:55 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HXVLUmEs9YUMMuoGMczDhBXe0fyKjSac+1DpydhJzywWQxK3ZT/NiMP8XNZNO0lQA3yd4d1pkSCFrSoAiC70UUBQw6c/0jq55ABdyAccQzGSkwAcWGeofe8xkz7D6HFP5v1TbPKf5ODmUO1f4/6Kbg6YJb5DqsC+DYFNUbsDnPrt4biVYe62OkfYHeFAOZcLzsX6+pl1YC0Qoa2UzmiparuXsj0/3EwsYiUAzmsWoX0ed1hD+4nwawpBeW518cxpy1+ddG+4y2nkqPB0X+MAoJVis9DhwqnzdnMo8xJR8aQZtxhgVKFXKTzEpB+9hZsTruxtvoTxdRwJzhBxTfgxhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=o9p+JWkf2/gi0FVu/oZcjQ/tbdr260lXxz8jg8iDHco=; b=Cbdz/iYZ5U7foy9jc72saPPSH5nAaqQh/ZRR2kcVUhwotOwZ4QALeiN5ZmEXaXwp9ssDrBQADQhQiEGUwpUzMSCGN55QZuSwkH/57aWoxGTC8nvOliDu2Kui/J4wKt0+MjnuXinfOzVuYd42Tg8HLVLNlLbh1uJkAX7GzlsB2uYFKdz3TjcjzUhwFXegcbq8sNIGHV9PMgML9aquo7oOv+FsxczCOLhVbkPqVfUlrwYrDypNERiN/fYE1uwq/xE7olOzr/JeEWxZdYPZlAvaPt7XwG/07HD6CanbIvNa/9/yoQXPI6OIoErXWU9241TTZyadXKf2FRo4xyade656JQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=o9p+JWkf2/gi0FVu/oZcjQ/tbdr260lXxz8jg8iDHco=; b=ZjiUESH9PrP8vtw8U54Ci/BCKc09XnJdBBKgZhiWwXnrvsF/wtBXf8sjvpnwZVfJ26rf2PtylFw1uDPN9IReG98cokE6I34gMZAKvp1OhHPOukR/s30frcMjoTVcSAQmdWMm7U3GOge5iwgdzUQY9jlhTV719J/WD8nJopbiOJPIZpbf/b7mLlSnUYey8Yk/p7n1HM7nB9Pv8EnSmz0L3v4bmJYilzr3WeCBXu5rMoS+6DNmYITHGaIWF3oI/e/V36JdHLxgsaVQylA/1b0P9ShnOwJ7yYvs+BnORQkgk3LduVNvWvwvfQlLuHbb0Tdk17tQGapikbvKRcBTIvzxnw== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:45 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:45 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:22 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [j8Qguo+gidbfvww4ivofFk4DMIi9gdVp] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-2-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: 8456c77e-c30f-498d-6e8d-08dc1b72197f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: f9TdsDVwgvaUbx/wjX0twUl8Z6MWeLeVQRCF4hDxwYxXq/LVrSWpWNHSFpVM6ZxdZIu0JW3tfWzrCeR3jiE3NgjbeCRqVStRHkai4YP9CegU1OSX5NBDkidZZfT9xUwAOyRwyJsbyt0STVTXgTZeslYXv3punurVeyo+1Xf6I+qhUQKgl2q8t2ErQtzxwq79SofmYzQFqnQSycfgCAmg3rlsTu7Xw7j0BRXSXwuA6NBcEqeexrBQF6yXsS7yKJF7K9HU31kl1a5WuvcsFj1Mag4Yivvlmpk5ulDlfZNioFA4bQfGPs6Ws7CXJ/H4EfpczBH/GTJIJbnfOQOfIlv2WOV9bI2BumE0Uchakbb9UTN9q7bZ8l1wxYC/boSAOjlj4Lv2fGClUzK1GYBsaLOLrXCVsT4S8uu7pviphHBpO6tMk8Kr8pdYEnDkkwca86/lJnvtMjAybCqmy4+JfhRL8/6feW457Kh4EpNxBUB2RSIi1fKWVVRmanw6fqWrxVGW0sSVIJMMxFbS3NG94zFNnYTBUPHsl11UhX10/S4NM2KAkhGj7sbuo8caY7EUTnUYQs5dNPz2VeH6yBQl4rOm0po3IG2KbgdCSwByYL65e3BAyngzz0rTPR7tS/R6lA2p X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: p6VDL1w62Bfr9sQ7OZoDypzpVII5CL6afKC6Sg7LlNWqC8vbpeiNbgzi61385+InNDmpaGT6Q6gT2ZeTk0TH6dCnquWgQ8Bc0SyjQ/SBcS6MAY+7KGHg495vfSgVVW4d4/axKwE3JqFAaemyyhmwoZLrrD5+igKvRblRiqgtdVCp53GyvdIfqwcymvGCSsuydfa8P/bYhO1uV1djxvOeNM8KJBgnGIoFppJBFFNy56r+IQY2PY39ckh4kym7/NSuUE/dVy+2SV5meg+86K06AWsDygWTXphO/RMvTIWxYkUxxHi4nEbwH+wYTHe+B1RGsbf/kWaAb2S76Cw98jo+VixaSNI3kxeg0a7+QW4P030LpGH6zmJvzeVZoP4S/QmrKJ4tqTqU8aod6MMDk73hEuOhNstZgYmcpyPNnbi/26DQeP95xSEMgia5IxgpoTwuEGClMvlYZjsFHXhi3mDMY+yw+rjxGyQwETHdWrHGupmW0bcU/NWdVAy9hB+WlxCEMwHVjSB37Z9n529iBLWqDZfWsoHqv4dK2dTqINCECnNyKzmnMQCdkJ/mgf8DcZ6KsxRLw/MqlMjc/1Rgt26wzBWFioNG+Yrww3ql2w7QJwftEii3bqgMCeDHQ4DLcIkXOUWBKANUdc6SFaorAQ+c/4avUQ341NcrGBDdig6eJ1KcfkyffSNS6YJeUkb/nFQlS3pMgHnz1b5m4FUJXGHH9Jx6nKkTBQq7UcOsluMr9MNB/fzY7w8h1/qhOq9Bm9qpzD5Uguju8obl8Qeu24jQEUKwXis71Zu7hLANFv4GkiL4OEKfY9UxvkN09T1r1B7f+KoIJgvVjKgMpci04ri0xBCCeGKr5/n88SI9vbptnS4BG1apJtQ+Yg5rLwFU6w/HAI8ysaCxJ6kdv+Fgr1iDQFGu21bzA052XJWcUC2FwTBN30IAZM0g1uIg7Lyp0iHbF6EkJrrEcEby+IVA7tcGjfa+no/gx7x0Iw6Fl1ywpsnnGz04FIQwRDRkvEqcuXPIuUFRyOvj5iZ3B8aFT466HW0N7PBO9OT6CDiCNWyKeF+K7fkN4rzy/XiHelYEbuKCGYzbCMFnSnIgVlWUrumybDz63aBmhT8dtW6OpGTt1Wgiq8rf4GLQGB5vqs1Ja2kwV/3VVxjG82iY/Rgjw+3ACTtEWeGOuunLXzDrjK6XH+RbNpSfZfKCNtlGMGoiBdUaPO+lab94/c68lCKLibRFS0D76OUdf1A3nPAYn3w+qJI= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8456c77e-c30f-498d-6e8d-08dc1b72197f X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:45.0029 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 2/8] avcodec/hevcdsp_template: reuse put/put_luma/put_chroma from h2656_inter_template 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rkHbjCVtgyql From: Wu Jianhua Signed-off-by: Wu Jianhua --- libavcodec/hevcdsp_template.c | 594 +++------------------------------- 1 file changed, 46 insertions(+), 548 deletions(-) diff --git a/libavcodec/hevcdsp_template.c b/libavcodec/hevcdsp_template.c index 0de14e9dcf..9b48bdf08e 100644 --- a/libavcodec/hevcdsp_template.c +++ b/libavcodec/hevcdsp_template.c @@ -26,6 +26,7 @@ #include "bit_depth_template.c" #include "hevcdsp.h" #include "h26x/h2656_sao_template.c" +#include "h26x/h2656_inter_template.c" static void FUNC(put_pcm)(uint8_t *_dst, ptrdiff_t stride, int width, int height, GetBitContext *gb, int pcm_bit_depth) @@ -299,37 +300,51 @@ IDCT_DC(32) //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// -static void FUNC(put_hevc_pel_pixels)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = src[x] << (14 - BIT_DEPTH); - src += srcstride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_pel_uni_pixels)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - - for (y = 0; y < height; y++) { - memcpy(dst, src, width * sizeof(pixel)); - src += srcstride; - dst += dststride; - } -} +#define ff_hevc_pel_filters ff_hevc_qpel_filters +#define DECL_HV_FILTER(f) \ + const uint8_t *hf = ff_hevc_ ## f ## _filters[mx - 1]; \ + const uint8_t *vf = ff_hevc_ ## f ## _filters[my - 1]; + +#define FW_PUT(p, f, t) \ +static void FUNC(put_hevc_## f)(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, int height, \ + intptr_t mx, intptr_t my, int width) \ +{ \ + DECL_HV_FILTER(p) \ + FUNC(put_ ## t)(dst, src, srcstride, height, hf, vf, width); \ +} + +#define FW_PUT_UNI(p, f, t) \ +static void FUNC(put_hevc_ ## f)(uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, \ + ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width) \ +{ \ + DECL_HV_FILTER(p) \ + FUNC(put_ ## t)(dst, dststride, src, srcstride, height, hf, vf, width); \ +} + +#define FW_PUT_UNI_W(p, f, t) \ +static void FUNC(put_hevc_ ## f)(uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, \ + ptrdiff_t srcstride,int height, int denom, int wx, int ox, \ + intptr_t mx, intptr_t my, int width) \ +{ \ + DECL_HV_FILTER(p) \ + FUNC(put_ ## t)(dst, dststride, src, srcstride, height, denom, wx, ox, hf, vf, width); \ +} + +#define FW_PUT_FUNCS(f, t, dir) \ + FW_PUT(f, f ## _ ## dir, t ## _ ## dir) \ + FW_PUT_UNI(f, f ## _uni_ ## dir, uni_ ## t ## _ ## dir) \ + FW_PUT_UNI_W(f, f ## _uni_w_ ## dir, uni_## t ## _w_ ## dir) + +FW_PUT(pel, pel_pixels, pixels) +FW_PUT_UNI(pel, pel_uni_pixels, uni_pixels) +FW_PUT_UNI_W(pel, pel_uni_w_pixels, uni_w_pixels) + +FW_PUT_FUNCS(qpel, luma, h ) +FW_PUT_FUNCS(qpel, luma, v ) +FW_PUT_FUNCS(qpel, luma, hv ) +FW_PUT_FUNCS(epel, chroma, h ) +FW_PUT_FUNCS(epel, chroma, v ) +FW_PUT_FUNCS(epel, chroma, hv ) static void FUNC(put_hevc_pel_bi_pixels)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, @@ -357,30 +372,6 @@ static void FUNC(put_hevc_pel_bi_pixels)(uint8_t *_dst, ptrdiff_t _dststride, co } } -static void FUNC(put_hevc_pel_uni_w_pixels)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel((((src[x] << (14 - BIT_DEPTH)) * wx + offset) >> shift) + ox); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_pel_bi_w_pixels)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -420,96 +411,6 @@ static void FUNC(put_hevc_pel_bi_w_pixels)(uint8_t *_dst, ptrdiff_t _dststride, filter[6] * src[x + 3 * stride] + \ filter[7] * src[x + 4 * stride]) -static void FUNC(put_hevc_qpel_h)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[mx - 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_qpel_v)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[my - 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8); - src += srcstride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_qpel_hv)(int16_t *dst, - const uint8_t *_src, - ptrdiff_t _srcstride, - int height, intptr_t mx, - intptr_t my, int width) -{ - int x, y; - const int8_t *filter; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - - src -= QPEL_EXTRA_BEFORE * srcstride; - filter = ff_hevc_qpel_filters[mx - 1]; - for (y = 0; y < height + QPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_qpel_filters[my - 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6; - tmp += MAX_PB_SIZE; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_qpel_uni_h)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[mx - 1]; - int shift = 14 - BIT_DEPTH; - -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_qpel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -538,33 +439,6 @@ static void FUNC(put_hevc_qpel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, const } } -static void FUNC(put_hevc_qpel_uni_v)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[my - 1]; - int shift = 14 - BIT_DEPTH; - -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += srcstride; - dst += dststride; - } -} - - static void FUNC(put_hevc_qpel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -593,46 +467,6 @@ static void FUNC(put_hevc_qpel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_qpel_uni_hv)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const int8_t *filter; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - int shift = 14 - BIT_DEPTH; - -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - src -= QPEL_EXTRA_BEFORE * srcstride; - filter = ff_hevc_qpel_filters[mx - 1]; - for (y = 0; y < height + QPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_qpel_filters[my - 1]; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); - tmp += MAX_PB_SIZE; - dst += dststride; - } -} - static void FUNC(put_hevc_qpel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -673,33 +507,6 @@ static void FUNC(put_hevc_qpel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_qpel_uni_w_h)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, - intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[mx - 1]; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel((((QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_qpel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -728,33 +535,6 @@ static void FUNC(put_hevc_qpel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_qpel_uni_w_v)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, - intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_qpel_filters[my - 1]; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel((((QPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_qpel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -783,47 +563,6 @@ static void FUNC(put_hevc_qpel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_qpel_uni_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, - intptr_t mx, intptr_t my, int width) -{ - int x, y; - const int8_t *filter; - const pixel *src = (const pixel*)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - src -= QPEL_EXTRA_BEFORE * srcstride; - filter = ff_hevc_qpel_filters[mx - 1]; - for (y = 0; y < height + QPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = QPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + QPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_qpel_filters[my - 1]; - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel((((QPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); - tmp += MAX_PB_SIZE; - dst += dststride; - } -} - static void FUNC(put_hevc_qpel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -873,94 +612,6 @@ static void FUNC(put_hevc_qpel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, filter[2] * src[x + stride] + \ filter[3] * src[x + 2 * stride]) -static void FUNC(put_hevc_epel_h)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_epel_v)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[my - 1]; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8); - src += srcstride; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_epel_hv)(int16_t *dst, - const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - - src -= EPEL_EXTRA_BEFORE * srcstride; - - for (y = 0; y < height + EPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_epel_filters[my - 1]; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6; - tmp += MAX_PB_SIZE; - dst += MAX_PB_SIZE; - } -} - -static void FUNC(put_hevc_epel_uni_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_epel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -988,30 +639,6 @@ static void FUNC(put_hevc_epel_bi_h)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_epel_uni_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[my - 1]; - int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) + offset) >> shift); - src += srcstride; - dst += dststride; - } -} - static void FUNC(put_hevc_epel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -1038,44 +665,6 @@ static void FUNC(put_hevc_epel_bi_v)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_epel_uni_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - int shift = 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - src -= EPEL_EXTRA_BEFORE * srcstride; - - for (y = 0; y < height + EPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_epel_filters[my - 1]; - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) + offset) >> shift); - tmp += MAX_PB_SIZE; - dst += dststride; - } -} - static void FUNC(put_hevc_epel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width) @@ -1116,32 +705,6 @@ static void FUNC(put_hevc_epel_bi_hv)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_epel_uni_w_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dst[x] = av_clip_pixel((((EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - } - dst += dststride; - src += srcstride; - } -} - static void FUNC(put_hevc_epel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -1168,32 +731,6 @@ static void FUNC(put_hevc_epel_bi_w_h)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_epel_uni_w_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[my - 1]; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - dst[x] = av_clip_pixel((((EPEL_FILTER(src, srcstride) >> (BIT_DEPTH - 8)) * wx + offset) >> shift) + ox); - } - dst += dststride; - src += srcstride; - } -} - static void FUNC(put_hevc_epel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, @@ -1220,45 +757,6 @@ static void FUNC(put_hevc_epel_bi_w_v)(uint8_t *_dst, ptrdiff_t _dststride, } } -static void FUNC(put_hevc_epel_uni_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, - int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width) -{ - int x, y; - const pixel *src = (const pixel *)_src; - ptrdiff_t srcstride = _srcstride / sizeof(pixel); - pixel *dst = (pixel *)_dst; - ptrdiff_t dststride = _dststride / sizeof(pixel); - const int8_t *filter = ff_hevc_epel_filters[mx - 1]; - int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE]; - int16_t *tmp = tmp_array; - int shift = denom + 14 - BIT_DEPTH; -#if BIT_DEPTH < 14 - int offset = 1 << (shift - 1); -#else - int offset = 0; -#endif - - src -= EPEL_EXTRA_BEFORE * srcstride; - - for (y = 0; y < height + EPEL_EXTRA; y++) { - for (x = 0; x < width; x++) - tmp[x] = EPEL_FILTER(src, 1) >> (BIT_DEPTH - 8); - src += srcstride; - tmp += MAX_PB_SIZE; - } - - tmp = tmp_array + EPEL_EXTRA_BEFORE * MAX_PB_SIZE; - filter = ff_hevc_epel_filters[my - 1]; - - ox = ox * (1 << (BIT_DEPTH - 8)); - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel((((EPEL_FILTER(tmp, MAX_PB_SIZE) >> 6) * wx + offset) >> shift) + ox); - tmp += MAX_PB_SIZE; - dst += dststride; - } -} - static void FUNC(put_hevc_epel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, From patchwork Mon Jan 22 17:46:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45718 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130273pzf; Mon, 22 Jan 2024 09:47:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IF5nsgVMdsPi8eNE3Vn2354gnO5Iqmij2FlsI2rfKfCk4T9aBtVMc9+qEgik58SxXoRFSvq X-Received: by 2002:a2e:9b90:0:b0:2cc:3e21:23a with SMTP id z16-20020a2e9b90000000b002cc3e21023amr1911523lji.107.1705945635155; Mon, 22 Jan 2024 09:47:15 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ig7-20020a056402458700b00558548e5158si6572101edb.487.2024.01.22.09.47.10; Mon, 22 Jan 2024 09:47:15 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=RODz4CY7; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B7F1868D0A7; Mon, 22 Jan 2024 19:47:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2066.outbound.protection.outlook.com [40.92.99.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E770B68D050 for ; Mon, 22 Jan 2024 19:46:54 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CVCQikOsOub11Sf5TD3mQEtORxN2G2KPnUoNbnHgBvZXq8Q7iVov51bLO88UUz+9NELlh0kAQc65PrHKChoqLy7+lvspr67p6kPyePN6XtLLkP5DP8KEDSIFfgzEb9kR0x54lq6VXrl/Ez6TJ482PNT6/iEN+PBFOFf76ooxxP+D6CPVXV2B5GqC85kN30dRMKTz7BZgF65Ex4Sd3w/acd5MEt+H3u3g+c2f7tbbxSgTQoqmPCeX3Gvwyyek7O8uvZq7TISicrGkf4jagrXbgUPJJNg9LN45HufKlptsMGsdQDkr6yE1AKFSbuxx9R6Z58o/92h5DQvjWPEygcvBuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8Qjvt+2+6x3/gkEweKR0e4pBQ77bIlzOJPJaAgmEyko=; b=GgmqNniZzS39rOFAteYby7bH1gNwhXOkHoB3+U1RRJBIbq2czGt9d4VznW6xWRL3jUgWyBJ3IzPl2uTGzUNwZ36J1qCYsdpAkRkndCRUaUKywKNAW7RHQOfttXGwqiSPTP4muiVIHmEMojVA8eTWtJZ35B87b9nPe7sgYCY4Wsz2Yc3dT6+4v/g6EnV8PuL1BOVxSSL+bx2EQTdXYi2yTqmICCEuv+jV9VVlPaUrtnpZQQYQTLypzOuu8LUyLFqob5l+r2hEfOJ5S+V5yK+ZPMaJu41bBUk3w2WkRr98zVn2eScNigdMPWUFpgKu+frfOL7Fy3c7Ffx/lCMotQfs9A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8Qjvt+2+6x3/gkEweKR0e4pBQ77bIlzOJPJaAgmEyko=; b=RODz4CY7Pj0qHWJuD5l6B9L64+2oDrqJ8VPLI7LXyybKo6jwKhG9mJ7ewG69xDVlAv9+nCkF8Z0OncccJOGCzPycbmiYYGstFSH1ZIRuE8mdTHy6X1ussOgh3uBoi3aLtKJCuCIvPDuBAL2UCAoNMnfwyOaSprLlRdq5+jjXTguWdzpA+fb8vnBUN/kIAdc/WyhohSa003Cs4DbPH2IOt4unJtmkQ4UoJ/FOo0DyJdblMR1Dc0mlskvAuk0tZLEA84eQ9bYSOjWFFM+0KuKKyB9oOEygcY5Y7C3D8ru6S/2BqS/bukhP5E1lmP7TqLE/CfZDhS7CpgR2gNMqgmSALA== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:46 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:46 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:23 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [ySSMe1TWbExzaKTMEe49dflqR8ZzllHt] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-3-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: ca3e7f0d-e8f5-4891-1969-08dc1b721a1b X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: MuMh2rC+rla6Ca+yTJtlp1iXt/YOJeFIAV3qELJ3unlrf5XV8uEMgT6BfXpRgOOkUrA/EQSA2uD+5N3iWDn0YYOMa92k7Lsz6gLJxnKk3TEN3ckwNy26ExKMVouxLQ6ST89DTlB0j+FKfbrppFcKGuu66KB1Px1HJqL1SZEw9bsSYYx7ujbj4VI0Uw92fvNTywiRSteXIa+RNcsAA1W52PmqDTPZ/PtXrVjD7EjDR84cKltmDwmjDaMh/mJVIWRo/wwn1IzxNxOEgJXU9CR3gnNewrUo3aw5D4FXXMmn3KDXiGLC+L0F+P0N7fAG/hjrUqapbvQUfA+Je08yg3DIXXs+kzcyZNpc2zx+em7INU9CpZ0pFk+QnZk8rMyL1YnJEUrReLbSOlh2GDixaMR0FaiRfOJtbZJ+SExME/4jlmAtayBTiSMZBoCTanS7drjepZe5hMuJiTjN5iQLemAkeNOxWb9E8xcYFvB4E6iNhTh9w40ArUKXQLd2rzgenRp3lk/iSXw8bmcg4U97ETLDwgT40j+jhhKXoc5+Xtoiq4OpM8zxv8pJS3KDgPJmDOJFFOKDTjr5HGEBH92hSrLgfT5iZgpnlbbfiVx3MEwXtXVQUxI5DW+/2VimIah7fXFT X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NK//PEG/2Q+atPNjFOjen9GZaXafWEiNvABD9jz7TN783g5wqa5pKrBa9+aZfIcluewuJfnivA54UYQrlOGiP6xANFImUG3plyJD5qpD/zc+DpwH/XKBkSvvWrgRnXO8eA0hidBeXrU23V+CQILfo9i6/0Vg56cKjLWOeiXMEZ/U+D1zDeUumrx8rHK8jZVjzAJ/Cug0wGdhEM8ZKcC9uw9BJYKWebCnwCJm6fFa2XE8lUqooT6aXKBFqtfiy4TZ1OyBKaCCoH/8WSe/jZVumEkHj/eJ5RXHjtsb/pwqEmA0IpmfloZc07Bodt6skUG8UwuNVLrgqeIonjkswcRUBbmiDq6tGWFUF5sfbsdeU0CYJCLmrbxkHAlQZczazEM3cPZf1j9xOq6ZChONfv2xliU5DBVAh0snaJVCFzKaOi7iPk2aiMYmyrEle6/Ro8Lx+QcZqdN6KPKkbGWsFfAN15+1zVpJen03ttd7P6z4+6/3xYS0dc+rz/LEjgIQCbrtMfYmWaVFotwfu+fQpdA6OTQiTAD97kzqSWoFQwB+/fgC4YJpSo3LgDEe5mplm4zQ95DY+314jq4jNukinzGBgmdnBg+5WjvbSsrtTTiAi9BQ96AIX3LXpEcgJwXwaiT/v04NkC2YUhb3qvV3DuXvcueAgik9LxSlP027r8y2j9E0Xrnx3IpDjhDWFqPRm8cJRwHee8x/UqLb3DwIPRVOYmO+qcw8ueLNhkqfK9i0B1ILJm63YTcspklDbnXjxTZs5ueU1fBB9bTZyn9I3XGVZboATWz4fPCqassXTUNMlGoa7iH5UBoqteOoZJzQnokewWtcLsT/fWc3+DMgN7IG8b18Ah2nthUtDqnfE0r3tymgjqrmpGdmmf3v8uy2pLs9TCinmMViLuN+71OG7TNAOqFmxd7lTTXek/Z2EiDqWmLxg6W5czzgV0k0+1M08scCam4M2bOvQsYI5I0p37lZ0535R09ERhaLwtHxT2456STW5q26JFXr7U8jKlgoUdExo9kPv67nVMTFJ5h+T48/YBMuNgT37JAWggnWIaK70LYo4BY8XqZbYnA6PjGTd7ECSvLMGLsqDvbYZq1erhO8kEu9fuixujLoe3Cir2sr7h9O+1lfqlhrgbApUcoMGFRVQxZrzq36TD1PExJv54/QnOOm2vrB4PecZYT0el0iLCl2DRqZ9DF38dYP3s/qIyw2Yd+d9PUjizR9VieXVlG7Yiss+LfIGUpSP2EDE1NuwME= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ca3e7f0d-e8f5-4891-1969-08dc1b721a1b X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:46.0592 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 3/8] avcodec/x86/hevc_mc: move put/put_uni to h26x/h2656_inter.asm 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wzIJTKzulUWy From: Wu Jianhua This enable that the asm optimization can be reused by VVC Signed-off-by: Wu Jianhua --- libavcodec/x86/Makefile | 1 + libavcodec/x86/h26x/h2656_inter.asm | 1145 +++++++++++++++++++++++++++ libavcodec/x86/h26x/h2656dsp.c | 98 +++ libavcodec/x86/h26x/h2656dsp.h | 103 +++ libavcodec/x86/hevc_mc.asm | 462 +---------- libavcodec/x86/hevcdsp_init.c | 108 ++- 6 files changed, 1471 insertions(+), 446 deletions(-) create mode 100644 libavcodec/x86/h26x/h2656_inter.asm create mode 100644 libavcodec/x86/h26x/h2656dsp.c create mode 100644 libavcodec/x86/h26x/h2656dsp.h diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index d5fb30645a..8098cd840c 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -167,6 +167,7 @@ X86ASM-OBJS-$(CONFIG_HEVC_DECODER) += x86/hevc_add_res.o \ x86/hevc_deblock.o \ x86/hevc_idct.o \ x86/hevc_mc.o \ + x86/h26x/h2656_inter.o \ x86/hevc_sao.o \ x86/hevc_sao_10bit.o X86ASM-OBJS-$(CONFIG_JPEG2000_DECODER) += x86/jpeg2000dsp.o diff --git a/libavcodec/x86/h26x/h2656_inter.asm b/libavcodec/x86/h26x/h2656_inter.asm new file mode 100644 index 0000000000..aa296d549c --- /dev/null +++ b/libavcodec/x86/h26x/h2656_inter.asm @@ -0,0 +1,1145 @@ +; /* +; * Provide SSE luma and chroma mc functions for HEVC/VVC decoding +; * Copyright (c) 2013 Pierre-Edouard LEPERE +; * Copyright (c) 2023-2024 Nuo Mi +; * Copyright (c) 2023-2024 Wu Jianhua +; * +; * This file is part of FFmpeg. +; * +; * FFmpeg is free software; you can redistribute it and/or +; * modify it under the terms of the GNU Lesser General Public +; * License as published by the Free Software Foundation; either +; * version 2.1 of the License, or (at your option) any later version. +; * +; * FFmpeg is distributed in the hope that it will be useful, +; * but WITHOUT ANY WARRANTY; without even the implied warranty of +; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; * Lesser General Public License for more details. +; * +; * You should have received a copy of the GNU Lesser General Public +; * License along with FFmpeg; if not, write to the Free Software +; * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +; */ +%include "libavutil/x86/x86util.asm" + +%define MAX_PB_SIZE 64 + +SECTION_RODATA 32 +cextern pw_255 +cextern pw_512 +cextern pw_2048 +cextern pw_1023 +cextern pw_1024 +cextern pw_4096 +cextern pw_8192 +%define scale_8 pw_512 +%define scale_10 pw_2048 +%define scale_12 pw_8192 +%define max_pixels_8 pw_255 +%define max_pixels_10 pw_1023 +max_pixels_12: times 16 dw ((1 << 12)-1) +cextern pb_0 + +SECTION .text +%macro SIMPLE_LOAD 4 ;width, bitd, tab, r1 +%if %1 == 2 || (%2 == 8 && %1 <= 4) + movd %4, [%3] ; load data from source +%elif %1 == 4 || (%2 == 8 && %1 <= 8) + movq %4, [%3] ; load data from source +%elif notcpuflag(avx) + movu %4, [%3] ; load data from source +%elif %1 <= 8 || (%2 == 8 && %1 <= 16) + movdqu %4, [%3] +%else + movu %4, [%3] +%endif +%endmacro + +%macro VPBROADCASTW 2 +%if notcpuflag(avx2) + movd %1, %2 + pshuflw %1, %1, 0 + punpcklwd %1, %1 +%else + vpbroadcastw %1, %2 +%endif +%endmacro + +%macro MC_4TAP_FILTER 4 ; bitdepth, filter, a, b, + VPBROADCASTW %3, [%2q + 0 * 2] ; coeff 0, 1 + VPBROADCASTW %4, [%2q + 1 * 2] ; coeff 2, 3 +%if %1 != 8 + pmovsxbw %3, xmm%3 + pmovsxbw %4, xmm%4 +%endif +%endmacro + +%macro MC_4TAP_HV_FILTER 1 + VPBROADCASTW m12, [vfq + 0 * 2] ; vf 0, 1 + VPBROADCASTW m13, [vfq + 1 * 2] ; vf 2, 3 + VPBROADCASTW m14, [hfq + 0 * 2] ; hf 0, 1 + VPBROADCASTW m15, [hfq + 1 * 2] ; hf 2, 3 + + pmovsxbw m12, xm12 + pmovsxbw m13, xm13 +%if %1 != 8 + pmovsxbw m14, xm14 + pmovsxbw m15, xm15 +%endif + lea r3srcq, [srcstrideq*3] +%endmacro + +%macro MC_8TAP_SAVE_FILTER 5 ;offset, mm registers + mova [rsp + %1 + 0*mmsize], %2 + mova [rsp + %1 + 1*mmsize], %3 + mova [rsp + %1 + 2*mmsize], %4 + mova [rsp + %1 + 3*mmsize], %5 +%endmacro + +%macro MC_8TAP_FILTER 2-3 ;bitdepth, filter, offset + VPBROADCASTW m12, [%2q + 0 * 2] ; coeff 0, 1 + VPBROADCASTW m13, [%2q + 1 * 2] ; coeff 2, 3 + VPBROADCASTW m14, [%2q + 2 * 2] ; coeff 4, 5 + VPBROADCASTW m15, [%2q + 3 * 2] ; coeff 6, 7 +%if %0 == 3 + MC_8TAP_SAVE_FILTER %3, m12, m13, m14, m15 +%endif + +%if %1 != 8 + pmovsxbw m12, xm12 + pmovsxbw m13, xm13 + pmovsxbw m14, xm14 + pmovsxbw m15, xm15 + %if %0 == 3 + MC_8TAP_SAVE_FILTER %3 + 4*mmsize, m12, m13, m14, m15 + %endif +%elif %0 == 3 + pmovsxbw m8, xm12 + pmovsxbw m9, xm13 + pmovsxbw m10, xm14 + pmovsxbw m11, xm15 + MC_8TAP_SAVE_FILTER %3 + 4*mmsize, m8, m9, m10, m11 +%endif + +%endmacro + +%macro MC_4TAP_LOAD 4 +%if (%1 == 8 && %4 <= 4) +%define %%load movd +%elif (%1 == 8 && %4 <= 8) || (%1 > 8 && %4 <= 4) +%define %%load movq +%else +%define %%load movdqu +%endif + + %%load m0, [%2q ] +%ifnum %3 + %%load m1, [%2q+ %3] + %%load m2, [%2q+2*%3] + %%load m3, [%2q+3*%3] +%else + %%load m1, [%2q+ %3q] + %%load m2, [%2q+2*%3q] + %%load m3, [%2q+r3srcq] +%endif +%if %1 == 8 +%if %4 > 8 + SBUTTERFLY bw, 0, 1, 7 + SBUTTERFLY bw, 2, 3, 7 +%else + punpcklbw m0, m1 + punpcklbw m2, m3 +%endif +%else +%if %4 > 4 + SBUTTERFLY wd, 0, 1, 7 + SBUTTERFLY wd, 2, 3, 7 +%else + punpcklwd m0, m1 + punpcklwd m2, m3 +%endif +%endif +%endmacro + +%macro MC_8TAP_H_LOAD 4 +%assign %%stride (%1+7)/8 +%if %1 == 8 +%if %3 <= 4 +%define %%load movd +%elif %3 == 8 +%define %%load movq +%else +%define %%load movu +%endif +%else +%if %3 == 2 +%define %%load movd +%elif %3 == 4 +%define %%load movq +%else +%define %%load movu +%endif +%endif + %%load m0, [%2-3*%%stride] ;load data from source + %%load m1, [%2-2*%%stride] + %%load m2, [%2-%%stride ] + %%load m3, [%2 ] + %%load m4, [%2+%%stride ] + %%load m5, [%2+2*%%stride] + %%load m6, [%2+3*%%stride] + %%load m7, [%2+4*%%stride] + +%if %1 == 8 +%if %3 > 8 + SBUTTERFLY wd, 0, 1, %4 + SBUTTERFLY wd, 2, 3, %4 + SBUTTERFLY wd, 4, 5, %4 + SBUTTERFLY wd, 6, 7, %4 +%else + punpcklbw m0, m1 + punpcklbw m2, m3 + punpcklbw m4, m5 + punpcklbw m6, m7 +%endif +%else +%if %3 > 4 + SBUTTERFLY dq, 0, 1, %4 + SBUTTERFLY dq, 2, 3, %4 + SBUTTERFLY dq, 4, 5, %4 + SBUTTERFLY dq, 6, 7, %4 +%else + punpcklwd m0, m1 + punpcklwd m2, m3 + punpcklwd m4, m5 + punpcklwd m6, m7 +%endif +%endif +%endmacro + +%macro MC_8TAP_V_LOAD 5 + lea %5q, [%2] + sub %5q, r3srcq + movu m0, [%5q ] ;load x- 3*srcstride + movu m1, [%5q+ %3q ] ;load x- 2*srcstride + movu m2, [%5q+ 2*%3q ] ;load x-srcstride + movu m3, [%2 ] ;load x + movu m4, [%2+ %3q] ;load x+stride + movu m5, [%2+ 2*%3q] ;load x+2*stride + movu m6, [%2+r3srcq] ;load x+3*stride + movu m7, [%2+ 4*%3q] ;load x+4*stride +%if %1 == 8 +%if %4 > 8 + SBUTTERFLY bw, 0, 1, 8 + SBUTTERFLY bw, 2, 3, 8 + SBUTTERFLY bw, 4, 5, 8 + SBUTTERFLY bw, 6, 7, 8 +%else + punpcklbw m0, m1 + punpcklbw m2, m3 + punpcklbw m4, m5 + punpcklbw m6, m7 +%endif +%else +%if %4 > 4 + SBUTTERFLY wd, 0, 1, 8 + SBUTTERFLY wd, 2, 3, 8 + SBUTTERFLY wd, 4, 5, 8 + SBUTTERFLY wd, 6, 7, 8 +%else + punpcklwd m0, m1 + punpcklwd m2, m3 + punpcklwd m4, m5 + punpcklwd m6, m7 +%endif +%endif +%endmacro + +%macro PEL_12STORE2 3 + movd [%1], %2 +%endmacro +%macro PEL_12STORE4 3 + movq [%1], %2 +%endmacro +%macro PEL_12STORE6 3 + movq [%1], %2 + psrldq %2, 8 + movd [%1+8], %2 +%endmacro +%macro PEL_12STORE8 3 + movdqu [%1], %2 +%endmacro +%macro PEL_12STORE12 3 + PEL_12STORE8 %1, %2, %3 + movq [%1+16], %3 +%endmacro +%macro PEL_12STORE16 3 +%if cpuflag(avx2) + movu [%1], %2 +%else + PEL_12STORE8 %1, %2, %3 + movdqu [%1+16], %3 +%endif +%endmacro + +%macro PEL_10STORE2 3 + movd [%1], %2 +%endmacro +%macro PEL_10STORE4 3 + movq [%1], %2 +%endmacro +%macro PEL_10STORE6 3 + movq [%1], %2 + psrldq %2, 8 + movd [%1+8], %2 +%endmacro +%macro PEL_10STORE8 3 + movdqu [%1], %2 +%endmacro +%macro PEL_10STORE12 3 + PEL_10STORE8 %1, %2, %3 + movq [%1+16], %3 +%endmacro +%macro PEL_10STORE16 3 +%if cpuflag(avx2) + movu [%1], %2 +%else + PEL_10STORE8 %1, %2, %3 + movdqu [%1+16], %3 +%endif +%endmacro +%macro PEL_10STORE32 3 + PEL_10STORE16 %1, %2, %3 + movu [%1+32], %3 +%endmacro + +%macro PEL_8STORE2 3 + pextrw [%1], %2, 0 +%endmacro +%macro PEL_8STORE4 3 + movd [%1], %2 +%endmacro +%macro PEL_8STORE6 3 + movd [%1], %2 + pextrw [%1+4], %2, 2 +%endmacro +%macro PEL_8STORE8 3 + movq [%1], %2 +%endmacro +%macro PEL_8STORE12 3 + movq [%1], %2 + psrldq %2, 8 + movd [%1+8], %2 +%endmacro +%macro PEL_8STORE16 3 +%if cpuflag(avx2) + movdqu [%1], %2 +%else + movu [%1], %2 +%endif ; avx +%endmacro +%macro PEL_8STORE32 3 + movu [%1], %2 +%endmacro + +%macro LOOP_END 3 + add %1q, 2*MAX_PB_SIZE ; dst += dststride + add %2q, %3q ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop +%endmacro + + +%macro MC_PIXEL_COMPUTE 2-3 ;width, bitdepth +%if %2 == 8 +%if cpuflag(avx2) && %0 ==3 +%if %1 > 16 + vextracti128 xm1, m0, 1 + pmovzxbw m1, xm1 + psllw m1, 14-%2 +%endif + pmovzxbw m0, xm0 +%else ; not avx +%if %1 > 8 + punpckhbw m1, m0, m2 + psllw m1, 14-%2 +%endif + punpcklbw m0, m2 +%endif +%endif ;avx + psllw m0, 14-%2 +%endmacro + +%macro MC_4TAP_COMPUTE 4-8 ; bitdepth, width, filter1, filter2, HV/m0, m2, m1, m3 +%if %0 == 8 +%define %%reg0 %5 +%define %%reg2 %6 +%define %%reg1 %7 +%define %%reg3 %8 +%else +%define %%reg0 m0 +%define %%reg2 m2 +%define %%reg1 m1 +%define %%reg3 m3 +%endif +%if %1 == 8 +%if cpuflag(avx2) && (%0 == 5) +%if %2 > 16 + vperm2i128 m10, m0, m1, q0301 +%endif + vinserti128 m0, m0, xm1, 1 + mova m1, m10 +%if %2 > 16 + vperm2i128 m10, m2, m3, q0301 +%endif + vinserti128 m2, m2, xm3, 1 + mova m3, m10 +%endif + pmaddubsw %%reg0, %3 ;x1*c1+x2*c2 + pmaddubsw %%reg2, %4 ;x3*c3+x4*c4 + paddw %%reg0, %%reg2 +%if %2 > 8 + pmaddubsw %%reg1, %3 + pmaddubsw %%reg3, %4 + paddw %%reg1, %%reg3 +%endif +%else + pmaddwd %%reg0, %3 + pmaddwd %%reg2, %4 + paddd %%reg0, %%reg2 +%if %2 > 4 + pmaddwd %%reg1, %3 + pmaddwd %%reg3, %4 + paddd %%reg1, %%reg3 +%if %1 != 8 + psrad %%reg1, %1-8 +%endif +%endif +%if %1 != 8 + psrad %%reg0, %1-8 +%endif + packssdw %%reg0, %%reg1 +%endif +%endmacro + +%macro MC_8TAP_HV_COMPUTE 4 ; width, bitdepth, filter + +%if %2 == 8 + pmaddubsw m0, [%3q+0*mmsize] ;x1*c1+x2*c2 + pmaddubsw m2, [%3q+1*mmsize] ;x3*c3+x4*c4 + pmaddubsw m4, [%3q+2*mmsize] ;x5*c5+x6*c6 + pmaddubsw m6, [%3q+3*mmsize] ;x7*c7+x8*c8 + paddw m0, m2 + paddw m4, m6 + paddw m0, m4 +%else + pmaddwd m0, [%3q+4*mmsize] + pmaddwd m2, [%3q+5*mmsize] + pmaddwd m4, [%3q+6*mmsize] + pmaddwd m6, [%3q+7*mmsize] + paddd m0, m2 + paddd m4, m6 + paddd m0, m4 +%if %2 != 8 + psrad m0, %2-8 +%endif +%if %1 > 4 + pmaddwd m1, [%3q+4*mmsize] + pmaddwd m3, [%3q+5*mmsize] + pmaddwd m5, [%3q+6*mmsize] + pmaddwd m7, [%3q+7*mmsize] + paddd m1, m3 + paddd m5, m7 + paddd m1, m5 +%if %2 != 8 + psrad m1, %2-8 +%endif +%endif + p%4 m0, m1 +%endif +%endmacro + + +%macro MC_8TAP_COMPUTE 2-3 ; width, bitdepth +%if %2 == 8 +%if cpuflag(avx2) && (%0 == 3) + + vperm2i128 m10, m0, m1, q0301 + vinserti128 m0, m0, xm1, 1 + SWAP 1, 10 + + vperm2i128 m10, m2, m3, q0301 + vinserti128 m2, m2, xm3, 1 + SWAP 3, 10 + + + vperm2i128 m10, m4, m5, q0301 + vinserti128 m4, m4, xm5, 1 + SWAP 5, 10 + + vperm2i128 m10, m6, m7, q0301 + vinserti128 m6, m6, xm7, 1 + SWAP 7, 10 +%endif + + pmaddubsw m0, m12 ;x1*c1+x2*c2 + pmaddubsw m2, m13 ;x3*c3+x4*c4 + pmaddubsw m4, m14 ;x5*c5+x6*c6 + pmaddubsw m6, m15 ;x7*c7+x8*c8 + paddw m0, m2 + paddw m4, m6 + paddw m0, m4 +%if %1 > 8 + pmaddubsw m1, m12 + pmaddubsw m3, m13 + pmaddubsw m5, m14 + pmaddubsw m7, m15 + paddw m1, m3 + paddw m5, m7 + paddw m1, m5 +%endif +%else + pmaddwd m0, m12 + pmaddwd m2, m13 + pmaddwd m4, m14 + pmaddwd m6, m15 + paddd m0, m2 + paddd m4, m6 + paddd m0, m4 +%if %2 != 8 + psrad m0, %2-8 +%endif +%if %1 > 4 + pmaddwd m1, m12 + pmaddwd m3, m13 + pmaddwd m5, m14 + pmaddwd m7, m15 + paddd m1, m3 + paddd m5, m7 + paddd m1, m5 +%if %2 != 8 + psrad m1, %2-8 +%endif +%endif +%endif +%endmacro +%macro UNI_COMPUTE 5 + pmulhrsw %3, %5 +%if %1 > 8 || (%2 > 8 && %1 > 4) + pmulhrsw %4, %5 +%endif +%if %2 == 8 + packuswb %3, %4 +%else + CLIPW %3, [pb_0], [max_pixels_%2] +%if (%1 > 8 && notcpuflag(avx)) || %1 > 16 + CLIPW %4, [pb_0], [max_pixels_%2] +%endif +%endif +%endmacro + + +; ****************************** +; void %1_put_pixels(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** + +%macro PUT_PIXELS 3 + MC_PIXELS %1, %2, %3 + MC_UNI_PIXELS %1, %2, %3 +%endmacro + +%macro MC_PIXELS 3 +cglobal %1_put_pixels%2_%3, 4, 4, 3, dst, src, srcstride, height + pxor m2, m2 +.loop: + SIMPLE_LOAD %2, %3, srcq, m0 + MC_PIXEL_COMPUTE %2, %3, 1 + PEL_10STORE%2 dstq, m0, m1 + LOOP_END dst, src, srcstride + RET +%endmacro + +%macro MC_UNI_PIXELS 3 +cglobal %1_put_uni_pixels%2_%3, 5, 5, 2, dst, dststride, src, srcstride, height +.loop: + SIMPLE_LOAD %2, %3, srcq, m0 + PEL_%3STORE%2 dstq, m0, m1 + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET +%endmacro + +%macro PUT_4TAP 3 +%if cpuflag(avx2) +%define XMM_REGS 11 +%else +%define XMM_REGS 8 +%endif + +; ****************************** +; void %1_put_4tap_hX(int16_t *dst, +; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width); +; ****************************** +cglobal %1_put_4tap_h%2_%3, 5, 5, XMM_REGS, dst, src, srcstride, height, hf +%assign %%stride ((%3 + 7)/8) + MC_4TAP_FILTER %3, hf, m4, m5 +.loop: + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m4, m5, 1 + PEL_10STORE%2 dstq, m0, m1 + LOOP_END dst, src, srcstride + RET + +; ****************************** +; void %1_put_uni_4tap_hX(uint8_t *dst, ptrdiff_t dststride, +; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width); +; ****************************** +cglobal %1_put_uni_4tap_h%2_%3, 6, 7, XMM_REGS, dst, dststride, src, srcstride, height, hf +%assign %%stride ((%3 + 7)/8) + movdqa m6, [scale_%3] + MC_4TAP_FILTER %3, hf, m4, m5 +.loop: + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m4, m5 + UNI_COMPUTE %2, %3, m0, m1, m6 + PEL_%3STORE%2 dstq, m0, m1 + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET + +; ****************************** +; void %1_put_4tap_v(int16_t *dst, +; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width) +; ****************************** +cglobal %1_put_4tap_v%2_%3, 6, 6, XMM_REGS, dst, src, srcstride, height, r3src, vf + sub srcq, srcstrideq + MC_4TAP_FILTER %3, vf, m4, m5 + lea r3srcq, [srcstrideq*3] +.loop: + MC_4TAP_LOAD %3, srcq, srcstride, %2 + MC_4TAP_COMPUTE %3, %2, m4, m5, 1 + PEL_10STORE%2 dstq, m0, m1 + LOOP_END dst, src, srcstride + RET + +; ****************************** +; void %1_put_uni_4tap_vX(uint8_t *dst, ptrdiff_t dststride, +; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width); +; ****************************** +cglobal %1_put_uni_4tap_v%2_%3, 7, 7, XMM_REGS, dst, dststride, src, srcstride, height, r3src, vf + movdqa m6, [scale_%3] + sub srcq, srcstrideq + MC_4TAP_FILTER %3, vf, m4, m5 + lea r3srcq, [srcstrideq*3] +.loop: + MC_4TAP_LOAD %3, srcq, srcstride, %2 + MC_4TAP_COMPUTE %3, %2, m4, m5 + UNI_COMPUTE %2, %3, m0, m1, m6 + PEL_%3STORE%2 dstq, m0, m1 + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET +%endmacro + +%macro PUT_4TAP_HV 3 +; ****************************** +; void put_4tap_hv(int16_t *dst, +; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width) +; ****************************** +cglobal %1_put_4tap_hv%2_%3, 6, 7, 16 , dst, src, srcstride, height, hf, vf, r3src +%assign %%stride ((%3 + 7)/8) + sub srcq, srcstrideq + MC_4TAP_HV_FILTER %3 + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m8, m1 +%endif + SWAP m4, m0 + add srcq, srcstrideq + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m9, m1 +%endif + SWAP m5, m0 + add srcq, srcstrideq + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m10, m1 +%endif + SWAP m6, m0 + add srcq, srcstrideq +.loop: + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m11, m1 +%endif + SWAP m7, m0 + punpcklwd m0, m4, m5 + punpcklwd m2, m6, m7 +%if %2 > 4 + punpckhwd m1, m4, m5 + punpckhwd m3, m6, m7 +%endif + MC_4TAP_COMPUTE 14, %2, m12, m13 +%if (%2 > 8 && (%3 == 8)) + punpcklwd m4, m8, m9 + punpcklwd m2, m10, m11 + punpckhwd m8, m8, m9 + punpckhwd m3, m10, m11 + MC_4TAP_COMPUTE 14, %2, m12, m13, m4, m2, m8, m3 +%if cpuflag(avx2) + vinserti128 m2, m0, xm4, 1 + vperm2i128 m3, m0, m4, q0301 + PEL_10STORE%2 dstq, m2, m3 +%else + PEL_10STORE%2 dstq, m0, m4 +%endif +%else + PEL_10STORE%2 dstq, m0, m1 +%endif + movdqa m4, m5 + movdqa m5, m6 + movdqa m6, m7 +%if (%2 > 8 && (%3 == 8)) + mova m8, m9 + mova m9, m10 + mova m10, m11 +%endif + LOOP_END dst, src, srcstride + RET + +cglobal %1_put_uni_4tap_hv%2_%3, 7, 8, 16 , dst, dststride, src, srcstride, height, hf, vf, r3src +%assign %%stride ((%3 + 7)/8) + sub srcq, srcstrideq + MC_4TAP_HV_FILTER %3 + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m8, m1 +%endif + SWAP m4, m0 + add srcq, srcstrideq + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m9, m1 +%endif + SWAP m5, m0 + add srcq, srcstrideq + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m10, m1 +%endif + SWAP m6, m0 + add srcq, srcstrideq +.loop: + MC_4TAP_LOAD %3, srcq-%%stride, %%stride, %2 + MC_4TAP_COMPUTE %3, %2, m14, m15 +%if (%2 > 8 && (%3 == 8)) + SWAP m11, m1 +%endif + mova m7, m0 + punpcklwd m0, m4, m5 + punpcklwd m2, m6, m7 +%if %2 > 4 + punpckhwd m1, m4, m5 + punpckhwd m3, m6, m7 +%endif + MC_4TAP_COMPUTE 14, %2, m12, m13 +%if (%2 > 8 && (%3 == 8)) + punpcklwd m4, m8, m9 + punpcklwd m2, m10, m11 + punpckhwd m8, m8, m9 + punpckhwd m3, m10, m11 + MC_4TAP_COMPUTE 14, %2, m12, m13, m4, m2, m8, m3 + UNI_COMPUTE %2, %3, m0, m4, [scale_%3] +%else + UNI_COMPUTE %2, %3, m0, m1, [scale_%3] +%endif + PEL_%3STORE%2 dstq, m0, m1 + mova m4, m5 + mova m5, m6 + mova m6, m7 +%if (%2 > 8 && (%3 == 8)) + mova m8, m9 + mova m9, m10 + mova m10, m11 +%endif + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET +%endmacro + +; ****************************** +; void put_8tap_hX_X_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** + +%macro PUT_8TAP 3 +cglobal %1_put_8tap_h%2_%3, 5, 5, 16, dst, src, srcstride, height, hf + MC_8TAP_FILTER %3, hf +.loop: + MC_8TAP_H_LOAD %3, srcq, %2, 10 + MC_8TAP_COMPUTE %2, %3, 1 +%if %3 > 8 + packssdw m0, m1 +%endif + PEL_10STORE%2 dstq, m0, m1 + LOOP_END dst, src, srcstride + RET + +; ****************************** +; void put_uni_8tap_hX_X_X(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** +cglobal %1_put_uni_8tap_h%2_%3, 6, 7, 16 , dst, dststride, src, srcstride, height, hf + mova m9, [scale_%3] + MC_8TAP_FILTER %3, hf +.loop: + MC_8TAP_H_LOAD %3, srcq, %2, 10 + MC_8TAP_COMPUTE %2, %3 +%if %3 > 8 + packssdw m0, m1 +%endif + UNI_COMPUTE %2, %3, m0, m1, m9 + PEL_%3STORE%2 dstq, m0, m1 + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET + + +; ****************************** +; void put_8tap_vX_X_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** +cglobal %1_put_8tap_v%2_%3, 6, 8, 16, dst, src, srcstride, height, r3src, vf + MC_8TAP_FILTER %3, vf + lea r3srcq, [srcstrideq*3] +.loop: + MC_8TAP_V_LOAD %3, srcq, srcstride, %2, r7 + MC_8TAP_COMPUTE %2, %3, 1 +%if %3 > 8 + packssdw m0, m1 +%endif + PEL_10STORE%2 dstq, m0, m1 + LOOP_END dst, src, srcstride + RET + +; ****************************** +; void put_uni_8tap_vX_X_X(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** +cglobal %1_put_uni_8tap_v%2_%3, 7, 9, 16, dst, dststride, src, srcstride, height, r3src, vf + MC_8TAP_FILTER %3, vf + movdqa m9, [scale_%3] + lea r3srcq, [srcstrideq*3] +.loop: + MC_8TAP_V_LOAD %3, srcq, srcstride, %2, r8 + MC_8TAP_COMPUTE %2, %3 +%if %3 > 8 + packssdw m0, m1 +%endif + UNI_COMPUTE %2, %3, m0, m1, m9 + PEL_%3STORE%2 dstq, m0, m1 + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET + +%endmacro + + +; ****************************** +; void put_8tap_hvX_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; int height, const int8_t *hf, const int8_t *vf, int width) +; ****************************** +%macro PUT_8TAP_HV 3 +cglobal %1_put_8tap_hv%2_%3, 6, 7, 16, 0 - mmsize*16, dst, src, srcstride, height, hf, vf, r3src + MC_8TAP_FILTER %3, hf, 0 + lea hfq, [rsp] + MC_8TAP_FILTER %3, vf, 8*mmsize + lea vfq, [rsp + 8*mmsize] + + lea r3srcq, [srcstrideq*3] + sub srcq, r3srcq + + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m8, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m9, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m10, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m11, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m12, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m13, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m14, m0 + add srcq, srcstrideq +.loop: + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m15, m0 + punpcklwd m0, m8, m9 + punpcklwd m2, m10, m11 + punpcklwd m4, m12, m13 + punpcklwd m6, m14, m15 +%if %2 > 4 + punpckhwd m1, m8, m9 + punpckhwd m3, m10, m11 + punpckhwd m5, m12, m13 + punpckhwd m7, m14, m15 +%endif +%if %2 <= 4 + movq m8, m9 + movq m9, m10 + movq m10, m11 + movq m11, m12 + movq m12, m13 + movq m13, m14 + movq m14, m15 +%else + movdqa m8, m9 + movdqa m9, m10 + movdqa m10, m11 + movdqa m11, m12 + movdqa m12, m13 + movdqa m13, m14 + movdqa m14, m15 +%endif + MC_8TAP_HV_COMPUTE %2, 14, vf, ackssdw + PEL_10STORE%2 dstq, m0, m1 + + LOOP_END dst, src, srcstride + RET + + +cglobal %1_put_uni_8tap_hv%2_%3, 7, 9, 16, 0 - 16*mmsize, dst, dststride, src, srcstride, height, hf, vf, r3src + MC_8TAP_FILTER %3, hf, 0 + lea hfq, [rsp] + MC_8TAP_FILTER %3, vf, 8*mmsize + lea vfq, [rsp + 8*mmsize] + lea r3srcq, [srcstrideq*3] + sub srcq, r3srcq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m8, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m9, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m10, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m11, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m12, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m13, m0 + add srcq, srcstrideq + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m14, m0 + add srcq, srcstrideq +.loop: + MC_8TAP_H_LOAD %3, srcq, %2, 15 + MC_8TAP_HV_COMPUTE %2, %3, hf, ackssdw + SWAP m15, m0 + punpcklwd m0, m8, m9 + punpcklwd m2, m10, m11 + punpcklwd m4, m12, m13 + punpcklwd m6, m14, m15 +%if %2 > 4 + punpckhwd m1, m8, m9 + punpckhwd m3, m10, m11 + punpckhwd m5, m12, m13 + punpckhwd m7, m14, m15 +%endif + MC_8TAP_HV_COMPUTE %2, 14, vf, ackusdw + UNI_COMPUTE %2, %3, m0, m1, [scale_%3] + PEL_%3STORE%2 dstq, m0, m1 + +%if %2 <= 4 + movq m8, m9 + movq m9, m10 + movq m10, m11 + movq m11, m12 + movq m12, m13 + movq m13, m14 + movq m14, m15 +%else + mova m8, m9 + mova m9, m10 + mova m10, m11 + mova m11, m12 + mova m12, m13 + mova m13, m14 + mova m14, m15 +%endif + add dstq, dststrideq ; dst += dststride + add srcq, srcstrideq ; src += srcstride + dec heightd ; cmp height + jnz .loop ; height loop + RET + +%endmacro + +%macro H2656PUT_PIXELS 2 + PUT_PIXELS h2656, %1, %2 +%endmacro + +%macro H2656PUT_4TAP 2 + PUT_4TAP h2656, %1, %2 +%endmacro + +%macro H2656PUT_4TAP_HV 2 + PUT_4TAP_HV h2656, %1, %2 +%endmacro + +%macro H2656PUT_8TAP 2 + PUT_8TAP h2656, %1, %2 +%endmacro + +%macro H2656PUT_8TAP_HV 2 + PUT_8TAP_HV h2656, %1, %2 +%endmacro + +%if ARCH_X86_64 + +INIT_XMM sse4 +H2656PUT_PIXELS 2, 8 +H2656PUT_PIXELS 4, 8 +H2656PUT_PIXELS 6, 8 +H2656PUT_PIXELS 8, 8 +H2656PUT_PIXELS 12, 8 +H2656PUT_PIXELS 16, 8 + +H2656PUT_PIXELS 2, 10 +H2656PUT_PIXELS 4, 10 +H2656PUT_PIXELS 6, 10 +H2656PUT_PIXELS 8, 10 + +H2656PUT_PIXELS 2, 12 +H2656PUT_PIXELS 4, 12 +H2656PUT_PIXELS 6, 12 +H2656PUT_PIXELS 8, 12 + +H2656PUT_4TAP 2, 8 +H2656PUT_4TAP 4, 8 +H2656PUT_4TAP 6, 8 +H2656PUT_4TAP 8, 8 + +H2656PUT_4TAP 12, 8 +H2656PUT_4TAP 16, 8 + +H2656PUT_4TAP 2, 10 +H2656PUT_4TAP 4, 10 +H2656PUT_4TAP 6, 10 +H2656PUT_4TAP 8, 10 + +H2656PUT_4TAP 2, 12 +H2656PUT_4TAP 4, 12 +H2656PUT_4TAP 6, 12 +H2656PUT_4TAP 8, 12 + +H2656PUT_4TAP_HV 2, 8 +H2656PUT_4TAP_HV 4, 8 +H2656PUT_4TAP_HV 6, 8 +H2656PUT_4TAP_HV 8, 8 +H2656PUT_4TAP_HV 16, 8 + +H2656PUT_4TAP_HV 2, 10 +H2656PUT_4TAP_HV 4, 10 +H2656PUT_4TAP_HV 6, 10 +H2656PUT_4TAP_HV 8, 10 + +H2656PUT_4TAP_HV 2, 12 +H2656PUT_4TAP_HV 4, 12 +H2656PUT_4TAP_HV 6, 12 +H2656PUT_4TAP_HV 8, 12 + +H2656PUT_8TAP 4, 8 +H2656PUT_8TAP 8, 8 +H2656PUT_8TAP 12, 8 +H2656PUT_8TAP 16, 8 + +H2656PUT_8TAP 4, 10 +H2656PUT_8TAP 8, 10 + +H2656PUT_8TAP 4, 12 +H2656PUT_8TAP 8, 12 + +H2656PUT_8TAP_HV 4, 8 +H2656PUT_8TAP_HV 8, 8 + +H2656PUT_8TAP_HV 4, 10 +H2656PUT_8TAP_HV 8, 10 + +H2656PUT_8TAP_HV 4, 12 +H2656PUT_8TAP_HV 8, 12 + +%if HAVE_AVX2_EXTERNAL +INIT_YMM avx2 + +H2656PUT_PIXELS 32, 8 +H2656PUT_PIXELS 16, 10 +H2656PUT_PIXELS 16, 12 + +H2656PUT_8TAP 32, 8 +H2656PUT_8TAP 16, 10 +H2656PUT_8TAP 16, 12 + +H2656PUT_8TAP_HV 32, 8 +H2656PUT_8TAP_HV 16, 10 +H2656PUT_8TAP_HV 16, 12 + +H2656PUT_4TAP 32, 8 +H2656PUT_4TAP 16, 10 +H2656PUT_4TAP 16, 12 + +H2656PUT_4TAP_HV 32, 8 +H2656PUT_4TAP_HV 16, 10 +H2656PUT_4TAP_HV 16, 12 + +%endif + +%endif diff --git a/libavcodec/x86/h26x/h2656dsp.c b/libavcodec/x86/h26x/h2656dsp.c new file mode 100644 index 0000000000..27769f9c55 --- /dev/null +++ b/libavcodec/x86/h26x/h2656dsp.c @@ -0,0 +1,98 @@ +/* + * DSP for HEVC/VVC + * + * Copyright (C) 2022-2024 Nuo Mi + * Copyright (c) 2023-2024 Wu Jianhua + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "h2656dsp.h" + +#define mc_rep_func(name, bitd, step, W, opt) \ +void ff_h2656_put_##name##W##_##bitd##_##opt(int16_t *_dst, \ + const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width) \ +{ \ + int i; \ + int16_t *dst; \ + for (i = 0; i < W; i += step) { \ + const uint8_t *src = _src + (i * ((bitd + 7) / 8)); \ + dst = _dst + i; \ + ff_h2656_put_##name##step##_##bitd##_##opt(dst, src, _srcstride, height, hf, vf, width); \ + } \ +} + +#define mc_rep_uni_func(name, bitd, step, W, opt) \ +void ff_h2656_put_uni_##name##W##_##bitd##_##opt(uint8_t *_dst, ptrdiff_t dststride, \ + const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width) \ +{ \ + int i; \ + uint8_t *dst; \ + for (i = 0; i < W; i += step) { \ + const uint8_t *src = _src + (i * ((bitd + 7) / 8)); \ + dst = _dst + (i * ((bitd + 7) / 8)); \ + ff_h2656_put_uni_##name##step##_##bitd##_##opt(dst, dststride, src, _srcstride, \ + height, hf, vf, width); \ + } \ +} + +#define mc_rep_funcs(name, bitd, step, W, opt) \ + mc_rep_func(name, bitd, step, W, opt) \ + mc_rep_uni_func(name, bitd, step, W, opt) + +#define MC_REP_FUNCS_SSE4(fname) \ + mc_rep_funcs(fname, 8, 16,128, sse4) \ + mc_rep_funcs(fname, 8, 16, 64, sse4) \ + mc_rep_funcs(fname, 8, 16, 32, sse4) \ + mc_rep_funcs(fname, 10, 8,128, sse4) \ + mc_rep_funcs(fname, 10, 8, 64, sse4) \ + mc_rep_funcs(fname, 10, 8, 32, sse4) \ + mc_rep_funcs(fname, 10, 8, 16, sse4) \ + mc_rep_funcs(fname, 12, 8,128, sse4) \ + mc_rep_funcs(fname, 12, 8, 64, sse4) \ + mc_rep_funcs(fname, 12, 8, 32, sse4) \ + mc_rep_funcs(fname, 12, 8, 16, sse4) \ + +MC_REP_FUNCS_SSE4(pixels) +MC_REP_FUNCS_SSE4(4tap_h) +MC_REP_FUNCS_SSE4(4tap_v) +MC_REP_FUNCS_SSE4(4tap_hv) +MC_REP_FUNCS_SSE4(8tap_h) +MC_REP_FUNCS_SSE4(8tap_v) +MC_REP_FUNCS_SSE4(8tap_hv) +mc_rep_funcs(8tap_hv, 8, 8, 16, sse4) + +#if HAVE_AVX2_EXTERNAL + +#define MC_REP_FUNCS_AVX2(fname) \ + mc_rep_funcs(fname, 8, 32, 64, avx2) \ + mc_rep_funcs(fname, 8, 32,128, avx2) \ + mc_rep_funcs(fname,10, 16, 32, avx2) \ + mc_rep_funcs(fname,10, 16, 64, avx2) \ + mc_rep_funcs(fname,10, 16,128, avx2) \ + mc_rep_funcs(fname,12, 16, 32, avx2) \ + mc_rep_funcs(fname,12, 16, 64, avx2) \ + mc_rep_funcs(fname,12, 16,128, avx2) \ + +MC_REP_FUNCS_AVX2(pixels) +MC_REP_FUNCS_AVX2(8tap_h) +MC_REP_FUNCS_AVX2(8tap_v) +MC_REP_FUNCS_AVX2(8tap_hv) +MC_REP_FUNCS_AVX2(4tap_h) +MC_REP_FUNCS_AVX2(4tap_v) +MC_REP_FUNCS_AVX2(4tap_hv) +#endif diff --git a/libavcodec/x86/h26x/h2656dsp.h b/libavcodec/x86/h26x/h2656dsp.h new file mode 100644 index 0000000000..8a2ab13607 --- /dev/null +++ b/libavcodec/x86/h26x/h2656dsp.h @@ -0,0 +1,103 @@ +/* + * DSP for HEVC/VVC + * + * Copyright (C) 2022-2024 Nuo Mi + * Copyright (c) 2023-2024 Wu Jianhua + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_X86_H26X_H2656DSP_H +#define AVCODEC_X86_H26X_H2656DSP_H + +#include "config.h" +#include "libavutil/x86/asm.h" +#include "libavutil/x86/cpu.h" +#include + +#define H2656_PEL_PROTOTYPE(name, D, opt) \ +void ff_h2656_put_ ## name ## _ ## D ## _##opt(int16_t *dst, const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width); \ +void ff_h2656_put_uni_ ## name ## _ ## D ## _##opt(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width); \ + +#define H2656_MC_8TAP_PROTOTYPES(fname, bitd, opt) \ + H2656_PEL_PROTOTYPE(fname##4, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##6, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##8, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##12, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##16, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##32, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##64, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##128, bitd, opt) + +H2656_MC_8TAP_PROTOTYPES(pixels , 8, sse4); +H2656_MC_8TAP_PROTOTYPES(pixels , 10, sse4); +H2656_MC_8TAP_PROTOTYPES(pixels , 12, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_h , 8, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_h , 10, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_h , 12, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_v , 8, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_v , 10, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_v , 12, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_hv , 8, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_hv , 10, sse4); +H2656_MC_8TAP_PROTOTYPES(8tap_hv , 12, sse4); + +#define H2656_MC_4TAP_PROTOTYPES(fname, bitd, opt) \ + H2656_PEL_PROTOTYPE(fname##2, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##4, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##6, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##8, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##12, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##16, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##32, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##64, bitd, opt); \ + H2656_PEL_PROTOTYPE(fname##128, bitd, opt) + +#define H2656_MC_4TAP_PROTOTYPES_SSE4(bitd) \ + H2656_PEL_PROTOTYPE(pixels2, bitd, sse4); \ + H2656_MC_4TAP_PROTOTYPES(4tap_h, bitd, sse4); \ + H2656_MC_4TAP_PROTOTYPES(4tap_v, bitd, sse4); \ + H2656_MC_4TAP_PROTOTYPES(4tap_hv, bitd, sse4); \ + +H2656_MC_4TAP_PROTOTYPES_SSE4(8) +H2656_MC_4TAP_PROTOTYPES_SSE4(10) +H2656_MC_4TAP_PROTOTYPES_SSE4(12) + +#define H2656_MC_8TAP_PROTOTYPES_AVX2(fname) \ + H2656_PEL_PROTOTYPE(fname##32 , 8, avx2); \ + H2656_PEL_PROTOTYPE(fname##64 , 8, avx2); \ + H2656_PEL_PROTOTYPE(fname##128, 8, avx2); \ + H2656_PEL_PROTOTYPE(fname##16 ,10, avx2); \ + H2656_PEL_PROTOTYPE(fname##32 ,10, avx2); \ + H2656_PEL_PROTOTYPE(fname##64 ,10, avx2); \ + H2656_PEL_PROTOTYPE(fname##128,10, avx2); \ + H2656_PEL_PROTOTYPE(fname##16 ,12, avx2); \ + H2656_PEL_PROTOTYPE(fname##32 ,12, avx2); \ + H2656_PEL_PROTOTYPE(fname##64 ,12, avx2); \ + H2656_PEL_PROTOTYPE(fname##128,12, avx2) \ + +H2656_MC_8TAP_PROTOTYPES_AVX2(pixels); +H2656_MC_8TAP_PROTOTYPES_AVX2(8tap_h); +H2656_MC_8TAP_PROTOTYPES_AVX2(8tap_v); +H2656_MC_8TAP_PROTOTYPES_AVX2(8tap_hv); +H2656_PEL_PROTOTYPE(8tap_hv16, 8, avx2); + +H2656_MC_8TAP_PROTOTYPES_AVX2(4tap_h); +H2656_MC_8TAP_PROTOTYPES_AVX2(4tap_v); +H2656_MC_8TAP_PROTOTYPES_AVX2(4tap_hv); + +#endif diff --git a/libavcodec/x86/hevc_mc.asm b/libavcodec/x86/hevc_mc.asm index eb267453fe..5489701e44 100644 --- a/libavcodec/x86/hevc_mc.asm +++ b/libavcodec/x86/hevc_mc.asm @@ -715,35 +715,6 @@ SECTION .text ; int height, int mx, int my) ; ****************************** -%macro HEVC_PUT_HEVC_PEL_PIXELS 2 -HEVC_PEL_PIXELS %1, %2 -HEVC_UNI_PEL_PIXELS %1, %2 -HEVC_BI_PEL_PIXELS %1, %2 -%endmacro - -%macro HEVC_PEL_PIXELS 2 -cglobal hevc_put_hevc_pel_pixels%1_%2, 4, 4, 3, dst, src, srcstride,height - pxor m2, m2 -.loop: - SIMPLE_LOAD %1, %2, srcq, m0 - MC_PIXEL_COMPUTE %1, %2, 1 - PEL_10STORE%1 dstq, m0, m1 - LOOP_END dst, src, srcstride - RET - %endmacro - -%macro HEVC_UNI_PEL_PIXELS 2 -cglobal hevc_put_hevc_uni_pel_pixels%1_%2, 5, 5, 2, dst, dststride, src, srcstride,height -.loop: - SIMPLE_LOAD %1, %2, srcq, m0 - PEL_%2STORE%1 dstq, m0, m1 - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET -%endmacro - %macro HEVC_BI_PEL_PIXELS 2 cglobal hevc_put_hevc_bi_pel_pixels%1_%2, 6, 6, 6, dst, dststride, src, srcstride, src2, height pxor m2, m2 @@ -777,32 +748,8 @@ cglobal hevc_put_hevc_bi_pel_pixels%1_%2, 6, 6, 6, dst, dststride, src, srcstrid %define XMM_REGS 8 %endif -cglobal hevc_put_hevc_epel_h%1_%2, 5, 6, XMM_REGS, dst, src, srcstride, height, mx, rfilter -%assign %%stride ((%2 + 7)/8) - EPEL_FILTER %2, mx, m4, m5, rfilter -.loop: - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m4, m5, 1 - PEL_10STORE%1 dstq, m0, m1 - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_epel_h%1_%2, 6, 7, XMM_REGS, dst, dststride, src, srcstride, height, mx, rfilter -%assign %%stride ((%2 + 7)/8) - movdqa m6, [pw_%2] - EPEL_FILTER %2, mx, m4, m5, rfilter -.loop: - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m4, m5 - UNI_COMPUTE %1, %2, m0, m1, m6 - PEL_%2STORE%1 dstq, m0, m1 - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET - cglobal hevc_put_hevc_bi_epel_h%1_%2, 7, 8, XMM_REGS, dst, dststride, src, srcstride, src2, height, mx, rfilter +%assign %%stride ((%2 + 7)/8) movdqa m6, [pw_bi_%2] EPEL_FILTER %2, mx, m4, m5, rfilter .loop: @@ -824,36 +771,6 @@ cglobal hevc_put_hevc_bi_epel_h%1_%2, 7, 8, XMM_REGS, dst, dststride, src, srcst ; int height, int mx, int my, int width) ; ****************************** -cglobal hevc_put_hevc_epel_v%1_%2, 4, 6, XMM_REGS, dst, src, srcstride, height, r3src, my - movifnidn myd, mym - sub srcq, srcstrideq - EPEL_FILTER %2, my, m4, m5, r3src - lea r3srcq, [srcstrideq*3] -.loop: - EPEL_LOAD %2, srcq, srcstride, %1 - EPEL_COMPUTE %2, %1, m4, m5, 1 - PEL_10STORE%1 dstq, m0, m1 - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_epel_v%1_%2, 5, 7, XMM_REGS, dst, dststride, src, srcstride, height, r3src, my - movifnidn myd, mym - movdqa m6, [pw_%2] - sub srcq, srcstrideq - EPEL_FILTER %2, my, m4, m5, r3src - lea r3srcq, [srcstrideq*3] -.loop: - EPEL_LOAD %2, srcq, srcstride, %1 - EPEL_COMPUTE %2, %1, m4, m5 - UNI_COMPUTE %1, %2, m0, m1, m6 - PEL_%2STORE%1 dstq, m0, m1 - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET - - cglobal hevc_put_hevc_bi_epel_v%1_%2, 6, 8, XMM_REGS, dst, dststride, src, srcstride, src2, height, r3src, my movifnidn myd, mym movdqa m6, [pw_bi_%2] @@ -882,135 +799,6 @@ cglobal hevc_put_hevc_bi_epel_v%1_%2, 6, 8, XMM_REGS, dst, dststride, src, srcst ; ****************************** %macro HEVC_PUT_HEVC_EPEL_HV 2 -cglobal hevc_put_hevc_epel_hv%1_%2, 6, 7, 16 , dst, src, srcstride, height, mx, my, r3src -%assign %%stride ((%2 + 7)/8) - sub srcq, srcstrideq - EPEL_HV_FILTER %2 - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m8, m1 -%endif - SWAP m4, m0 - add srcq, srcstrideq - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m9, m1 -%endif - SWAP m5, m0 - add srcq, srcstrideq - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m10, m1 -%endif - SWAP m6, m0 - add srcq, srcstrideq -.loop: - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m11, m1 -%endif - SWAP m7, m0 - punpcklwd m0, m4, m5 - punpcklwd m2, m6, m7 -%if %1 > 4 - punpckhwd m1, m4, m5 - punpckhwd m3, m6, m7 -%endif - EPEL_COMPUTE 14, %1, m12, m13 -%if (%1 > 8 && (%2 == 8)) - punpcklwd m4, m8, m9 - punpcklwd m2, m10, m11 - punpckhwd m8, m8, m9 - punpckhwd m3, m10, m11 - EPEL_COMPUTE 14, %1, m12, m13, m4, m2, m8, m3 -%if cpuflag(avx2) - vinserti128 m2, m0, xm4, 1 - vperm2i128 m3, m0, m4, q0301 - PEL_10STORE%1 dstq, m2, m3 -%else - PEL_10STORE%1 dstq, m0, m4 -%endif -%else - PEL_10STORE%1 dstq, m0, m1 -%endif - movdqa m4, m5 - movdqa m5, m6 - movdqa m6, m7 -%if (%1 > 8 && (%2 == 8)) - mova m8, m9 - mova m9, m10 - mova m10, m11 -%endif - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_epel_hv%1_%2, 7, 8, 16 , dst, dststride, src, srcstride, height, mx, my, r3src -%assign %%stride ((%2 + 7)/8) - sub srcq, srcstrideq - EPEL_HV_FILTER %2 - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m8, m1 -%endif - SWAP m4, m0 - add srcq, srcstrideq - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m9, m1 -%endif - SWAP m5, m0 - add srcq, srcstrideq - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m10, m1 -%endif - SWAP m6, m0 - add srcq, srcstrideq -.loop: - EPEL_LOAD %2, srcq-%%stride, %%stride, %1 - EPEL_COMPUTE %2, %1, m14, m15 -%if (%1 > 8 && (%2 == 8)) - SWAP m11, m1 -%endif - mova m7, m0 - punpcklwd m0, m4, m5 - punpcklwd m2, m6, m7 -%if %1 > 4 - punpckhwd m1, m4, m5 - punpckhwd m3, m6, m7 -%endif - EPEL_COMPUTE 14, %1, m12, m13 -%if (%1 > 8 && (%2 == 8)) - punpcklwd m4, m8, m9 - punpcklwd m2, m10, m11 - punpckhwd m8, m8, m9 - punpckhwd m3, m10, m11 - EPEL_COMPUTE 14, %1, m12, m13, m4, m2, m8, m3 - UNI_COMPUTE %1, %2, m0, m4, [pw_%2] -%else - UNI_COMPUTE %1, %2, m0, m1, [pw_%2] -%endif - PEL_%2STORE%1 dstq, m0, m1 - mova m4, m5 - mova m5, m6 - mova m6, m7 -%if (%1 > 8 && (%2 == 8)) - mova m8, m9 - mova m9, m10 - mova m10, m11 -%endif - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET cglobal hevc_put_hevc_bi_epel_hv%1_%2, 8, 9, 16, dst, dststride, src, srcstride, src2, height, mx, my, r3src %assign %%stride ((%2 + 7)/8) @@ -1093,34 +881,6 @@ cglobal hevc_put_hevc_bi_epel_hv%1_%2, 8, 9, 16, dst, dststride, src, srcstride, ; ****************************** %macro HEVC_PUT_HEVC_QPEL 2 -cglobal hevc_put_hevc_qpel_h%1_%2, 5, 6, 16, dst, src, srcstride, height, mx, rfilter - QPEL_FILTER %2, mx -.loop: - QPEL_H_LOAD %2, srcq, %1, 10 - QPEL_COMPUTE %1, %2, 1 -%if %2 > 8 - packssdw m0, m1 -%endif - PEL_10STORE%1 dstq, m0, m1 - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_qpel_h%1_%2, 6, 7, 16 , dst, dststride, src, srcstride, height, mx, rfilter - mova m9, [pw_%2] - QPEL_FILTER %2, mx -.loop: - QPEL_H_LOAD %2, srcq, %1, 10 - QPEL_COMPUTE %1, %2 -%if %2 > 8 - packssdw m0, m1 -%endif - UNI_COMPUTE %1, %2, m0, m1, m9 - PEL_%2STORE%1 dstq, m0, m1 - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET cglobal hevc_put_hevc_bi_qpel_h%1_%2, 7, 8, 16 , dst, dststride, src, srcstride, src2, height, mx, rfilter movdqa m9, [pw_bi_%2] @@ -1148,38 +908,6 @@ cglobal hevc_put_hevc_bi_qpel_h%1_%2, 7, 8, 16 , dst, dststride, src, srcstride, ; int height, int mx, int my, int width) ; ****************************** -cglobal hevc_put_hevc_qpel_v%1_%2, 4, 8, 16, dst, src, srcstride, height, r3src, my, rfilter - movifnidn myd, mym - lea r3srcq, [srcstrideq*3] - QPEL_FILTER %2, my -.loop: - QPEL_V_LOAD %2, srcq, srcstride, %1, r7 - QPEL_COMPUTE %1, %2, 1 -%if %2 > 8 - packssdw m0, m1 -%endif - PEL_10STORE%1 dstq, m0, m1 - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_qpel_v%1_%2, 5, 9, 16, dst, dststride, src, srcstride, height, r3src, my, rfilter - movifnidn myd, mym - movdqa m9, [pw_%2] - lea r3srcq, [srcstrideq*3] - QPEL_FILTER %2, my -.loop: - QPEL_V_LOAD %2, srcq, srcstride, %1, r8 - QPEL_COMPUTE %1, %2 -%if %2 > 8 - packssdw m0, m1 -%endif - UNI_COMPUTE %1, %2, m0, m1, m9 - PEL_%2STORE%1 dstq, m0, m1 - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET cglobal hevc_put_hevc_bi_qpel_v%1_%2, 6, 10, 16, dst, dststride, src, srcstride, src2, height, r3src, my, rfilter movifnidn myd, mym @@ -1210,162 +938,6 @@ cglobal hevc_put_hevc_bi_qpel_v%1_%2, 6, 10, 16, dst, dststride, src, srcstride, ; int height, int mx, int my) ; ****************************** %macro HEVC_PUT_HEVC_QPEL_HV 2 -cglobal hevc_put_hevc_qpel_hv%1_%2, 6, 8, 16, dst, src, srcstride, height, mx, my, r3src, rfilter -%if cpuflag(avx2) -%assign %%shift 4 -%else -%assign %%shift 3 -%endif - sub mxq, 1 - sub myq, 1 - shl mxq, %%shift ; multiply by 32 - shl myq, %%shift ; multiply by 32 - lea r3srcq, [srcstrideq*3] - sub srcq, r3srcq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m8, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m9, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m10, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m11, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m12, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m13, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m14, m0 - add srcq, srcstrideq -.loop: - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m15, m0 - punpcklwd m0, m8, m9 - punpcklwd m2, m10, m11 - punpcklwd m4, m12, m13 - punpcklwd m6, m14, m15 -%if %1 > 4 - punpckhwd m1, m8, m9 - punpckhwd m3, m10, m11 - punpckhwd m5, m12, m13 - punpckhwd m7, m14, m15 -%endif - QPEL_HV_COMPUTE %1, 14, my, ackssdw - PEL_10STORE%1 dstq, m0, m1 -%if %1 <= 4 - movq m8, m9 - movq m9, m10 - movq m10, m11 - movq m11, m12 - movq m12, m13 - movq m13, m14 - movq m14, m15 -%else - movdqa m8, m9 - movdqa m9, m10 - movdqa m10, m11 - movdqa m11, m12 - movdqa m12, m13 - movdqa m13, m14 - movdqa m14, m15 -%endif - LOOP_END dst, src, srcstride - RET - -cglobal hevc_put_hevc_uni_qpel_hv%1_%2, 7, 9, 16 , dst, dststride, src, srcstride, height, mx, my, r3src, rfilter -%if cpuflag(avx2) -%assign %%shift 4 -%else -%assign %%shift 3 -%endif - sub mxq, 1 - sub myq, 1 - shl mxq, %%shift ; multiply by 32 - shl myq, %%shift ; multiply by 32 - lea r3srcq, [srcstrideq*3] - sub srcq, r3srcq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m8, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m9, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m10, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m11, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m12, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m13, m0 - add srcq, srcstrideq - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m14, m0 - add srcq, srcstrideq -.loop: - QPEL_H_LOAD %2, srcq, %1, 15 - QPEL_HV_COMPUTE %1, %2, mx, ackssdw - SWAP m15, m0 - punpcklwd m0, m8, m9 - punpcklwd m2, m10, m11 - punpcklwd m4, m12, m13 - punpcklwd m6, m14, m15 -%if %1 > 4 - punpckhwd m1, m8, m9 - punpckhwd m3, m10, m11 - punpckhwd m5, m12, m13 - punpckhwd m7, m14, m15 -%endif - QPEL_HV_COMPUTE %1, 14, my, ackusdw - UNI_COMPUTE %1, %2, m0, m1, [pw_%2] - PEL_%2STORE%1 dstq, m0, m1 - -%if %1 <= 4 - movq m8, m9 - movq m9, m10 - movq m10, m11 - movq m11, m12 - movq m12, m13 - movq m13, m14 - movq m14, m15 -%else - mova m8, m9 - mova m9, m10 - mova m10, m11 - mova m11, m12 - mova m12, m13 - mova m13, m14 - mova m14, m15 -%endif - add dstq, dststrideq ; dst += dststride - add srcq, srcstrideq ; src += srcstride - dec heightd ; cmp height - jnz .loop ; height loop - RET cglobal hevc_put_hevc_bi_qpel_hv%1_%2, 8, 10, 16, dst, dststride, src, srcstride, src2, height, mx, my, r3src, rfilter %if cpuflag(avx2) @@ -1613,22 +1185,22 @@ WEIGHTING_FUNCS 4, 12 WEIGHTING_FUNCS 6, 12 WEIGHTING_FUNCS 8, 12 -HEVC_PUT_HEVC_PEL_PIXELS 2, 8 -HEVC_PUT_HEVC_PEL_PIXELS 4, 8 -HEVC_PUT_HEVC_PEL_PIXELS 6, 8 -HEVC_PUT_HEVC_PEL_PIXELS 8, 8 -HEVC_PUT_HEVC_PEL_PIXELS 12, 8 -HEVC_PUT_HEVC_PEL_PIXELS 16, 8 +HEVC_BI_PEL_PIXELS 2, 8 +HEVC_BI_PEL_PIXELS 4, 8 +HEVC_BI_PEL_PIXELS 6, 8 +HEVC_BI_PEL_PIXELS 8, 8 +HEVC_BI_PEL_PIXELS 12, 8 +HEVC_BI_PEL_PIXELS 16, 8 -HEVC_PUT_HEVC_PEL_PIXELS 2, 10 -HEVC_PUT_HEVC_PEL_PIXELS 4, 10 -HEVC_PUT_HEVC_PEL_PIXELS 6, 10 -HEVC_PUT_HEVC_PEL_PIXELS 8, 10 +HEVC_BI_PEL_PIXELS 2, 10 +HEVC_BI_PEL_PIXELS 4, 10 +HEVC_BI_PEL_PIXELS 6, 10 +HEVC_BI_PEL_PIXELS 8, 10 -HEVC_PUT_HEVC_PEL_PIXELS 2, 12 -HEVC_PUT_HEVC_PEL_PIXELS 4, 12 -HEVC_PUT_HEVC_PEL_PIXELS 6, 12 -HEVC_PUT_HEVC_PEL_PIXELS 8, 12 +HEVC_BI_PEL_PIXELS 2, 12 +HEVC_BI_PEL_PIXELS 4, 12 +HEVC_BI_PEL_PIXELS 6, 12 +HEVC_BI_PEL_PIXELS 8, 12 HEVC_PUT_HEVC_EPEL 2, 8 HEVC_PUT_HEVC_EPEL 4, 8 @@ -1693,8 +1265,8 @@ HEVC_PUT_HEVC_QPEL_HV 8, 12 %if HAVE_AVX2_EXTERNAL INIT_YMM avx2 ; adds ff_ and _avx2 to function name & enables 256b registers : m0 for 256b, xm0 for 128b. cpuflag(avx2) = 1 / notcpuflag(avx) = 0 -HEVC_PUT_HEVC_PEL_PIXELS 32, 8 -HEVC_PUT_HEVC_PEL_PIXELS 16, 10 +HEVC_BI_PEL_PIXELS 32, 8 +HEVC_BI_PEL_PIXELS 16, 10 HEVC_PUT_HEVC_EPEL 32, 8 HEVC_PUT_HEVC_EPEL 16, 10 diff --git a/libavcodec/x86/hevcdsp_init.c b/libavcodec/x86/hevcdsp_init.c index 6f45e5e0db..5c19330e19 100644 --- a/libavcodec/x86/hevcdsp_init.c +++ b/libavcodec/x86/hevcdsp_init.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2013 Seppo Tomperi - * Copyright (c) 2013 - 2014 Pierre-Edouard Lepere + * Copyright (c) 2013-2014 Pierre-Edouard Lepere + * Copyright (c) 2023-2024 Wu Jianhua * * This file is part of FFmpeg. * @@ -27,6 +28,7 @@ #include "libavutil/x86/cpu.h" #include "libavcodec/hevcdsp.h" #include "libavcodec/x86/hevcdsp.h" +#include "libavcodec/x86/h26x/h2656dsp.h" #define LFC_FUNC(DIR, DEPTH, OPT) \ void ff_hevc_ ## DIR ## _loop_filter_chroma_ ## DEPTH ## _ ## OPT(uint8_t *pix, ptrdiff_t stride, const int *tc, const uint8_t *no_p, const uint8_t *no_q); @@ -83,6 +85,110 @@ void ff_hevc_idct_32x32_10_ ## opt(int16_t *coeffs, int col_limit); IDCT_FUNCS(sse2) IDCT_FUNCS(avx) + +#define ff_hevc_pel_filters ff_hevc_qpel_filters +#define DECL_HV_FILTER(f) \ + const uint8_t *hf = ff_hevc_ ## f ## _filters[mx - 1]; \ + const uint8_t *vf = ff_hevc_ ## f ## _filters[my - 1]; + +#define FW_PUT(p, a, b, depth, opt) \ +void ff_hevc_put_hevc_ ## a ## _ ## depth ## _##opt(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, \ + int height, intptr_t mx, intptr_t my,int width) \ +{ \ + DECL_HV_FILTER(p) \ + ff_h2656_put_ ## b ## _ ## depth ## _##opt(dst, src, srcstride, height, hf, vf, width); \ +} + +#define FW_PUT_UNI(p, a, b, depth, opt) \ +void ff_hevc_put_hevc_uni_ ## a ## _ ## depth ## _##opt(uint8_t *dst, ptrdiff_t dststride, \ + const uint8_t *src, ptrdiff_t srcstride, \ + int height, intptr_t mx, intptr_t my, int width) \ +{ \ + DECL_HV_FILTER(p) \ + ff_h2656_put_uni_ ## b ## _ ## depth ## _##opt(dst, dststride, src, srcstride, height, hf, vf, width); \ +} + +#if ARCH_X86_64 && HAVE_SSE4_EXTERNAL + +#define FW_PUT_FUNCS(p, a, b, depth, opt) \ + FW_PUT(p, a, b, depth, opt) \ + FW_PUT_UNI(p, a, b, depth, opt) + +#define FW_PEL(w, depth, opt) FW_PUT_FUNCS(pel, pel_pixels##w, pixels##w, depth, opt) + +#define FW_DIR(npel, n, w, depth, opt) \ + FW_PUT_FUNCS(npel, npel ## _h##w, n ## tap_h##w, depth, opt) \ + FW_PUT_FUNCS(npel, npel ## _v##w, n ## tap_v##w, depth, opt) + +#define FW_DIR_HV(npel, n, w, depth, opt) \ + FW_PUT_FUNCS(npel, npel ## _hv##w, n ## tap_hv##w, depth, opt) + +FW_PEL(4, 8, sse4); +FW_PEL(6, 8, sse4); +FW_PEL(8, 8, sse4); +FW_PEL(12, 8, sse4); +FW_PEL(16, 8, sse4); +FW_PEL(4, 10, sse4); +FW_PEL(6, 10, sse4); +FW_PEL(8, 10, sse4); +FW_PEL(4, 12, sse4); +FW_PEL(6, 12, sse4); +FW_PEL(8, 12, sse4); + +#define FW_EPEL(w, depth, opt) FW_DIR(epel, 4, w, depth, opt) +#define FW_EPEL_HV(w, depth, opt) FW_DIR_HV(epel, 4, w, depth, opt) +#define FW_EPEL_FUNCS(w, depth, opt) \ + FW_EPEL(w, depth, opt) \ + FW_EPEL_HV(w, depth, opt) + +FW_EPEL(12, 8, sse4); + +FW_EPEL_FUNCS(4, 8, sse4); +FW_EPEL_FUNCS(6, 8, sse4); +FW_EPEL_FUNCS(8, 8, sse4); +FW_EPEL_FUNCS(16, 8, sse4); +FW_EPEL_FUNCS(4, 10, sse4); +FW_EPEL_FUNCS(6, 10, sse4); +FW_EPEL_FUNCS(8, 10, sse4); +FW_EPEL_FUNCS(4, 12, sse4); +FW_EPEL_FUNCS(6, 12, sse4); +FW_EPEL_FUNCS(8, 12, sse4); + +#define FW_QPEL(w, depth, opt) FW_DIR(qpel, 8, w, depth, opt) +#define FW_QPEL_HV(w, depth, opt) FW_DIR_HV(qpel, 8, w, depth, opt) +#define FW_QPEL_FUNCS(w, depth, opt) \ + FW_QPEL(w, depth, opt) \ + FW_QPEL_HV(w, depth, opt) + +FW_QPEL(12, 8, sse4); +FW_QPEL(16, 8, sse4); + +FW_QPEL_FUNCS(4, 8, sse4); +FW_QPEL_FUNCS(8, 8, sse4); +FW_QPEL_FUNCS(4, 10, sse4); +FW_QPEL_FUNCS(8, 10, sse4); +FW_QPEL_FUNCS(4, 12, sse4); +FW_QPEL_FUNCS(8, 12, sse4); + +#ifdef HAVE_AVX2_EXTERNAL + +FW_PEL(32, 8, avx2); +FW_PUT(pel, pel_pixels16, pixels16, 10, avx2); + +FW_EPEL(32, 8, avx2); +FW_EPEL(16, 10, avx2); + +FW_EPEL_HV(32, 8, avx2); +FW_EPEL_HV(16, 10, avx2); + +FW_QPEL(32, 8, avx2); +FW_QPEL(16, 10, avx2); + +FW_QPEL_HV(16, 10, avx2); + +#endif +#endif + #define mc_rep_func(name, bitd, step, W, opt) \ void ff_hevc_put_hevc_##name##W##_##bitd##_##opt(int16_t *_dst, \ const uint8_t *_src, ptrdiff_t _srcstride, int height, \ From patchwork Mon Jan 22 17:46:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45720 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130377pzf; Mon, 22 Jan 2024 09:47:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IELQOlQraCwi+IWGGYcjHUqplOuh9/jhgxM+5TKnKP3FRE1f8haL41tWXjJUiRt97j0Eus7 X-Received: by 2002:a17:907:76c6:b0:a2d:9c1e:9bfc with SMTP id kf6-20020a17090776c600b00a2d9c1e9bfcmr1257296ejc.7.1705945651414; Mon, 22 Jan 2024 09:47:31 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id by18-20020a170906a2d200b00a2877da8ed4si10887940ejb.584.2024.01.22.09.47.31; Mon, 22 Jan 2024 09:47:31 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=eJW1bCDV; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E91E568D0CE; Mon, 22 Jan 2024 19:47:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2066.outbound.protection.outlook.com [40.92.99.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1C08468D0C9 for ; Mon, 22 Jan 2024 19:47:01 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TuglNPIcdswobq1LZR3B7bBn/alyR+bGrgCiZWC1giphQWr/r8Kb1NZQkU6/6BkKm9WQJ9ZX+nlDA25ldxaWstsM4mGHfgg26JpR2/ONHURjufNAfr+YhGxrFERzOUrtufAlc970+mt7LzZilg7n+opMDYkJw9ax4HrCjzRfpBy1/vNw8e3RCtpytG+K3z9GXGi/U5kBi0JiV6ketC3RNdAPuimjUf4zXKcZd2Lzjtksru8Ha1lM7ZWbXm2GQdLESXkNkyZtYRl/g55+nNWncdBihVCg3A5VeoUY+eTJAJP1mD5gJEG1y16sLLtATxqRLJf7nw7IcJ9S5JdPmtXLWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3YWCPE3QJL1q8pUPyPgguKhxWpexD9mZ6X8ITP8r0ec=; b=C7DiRcLD0n7/tEarV3yZfhUDpHLssQkCWIkHtbpZtzs005N9u3ddYl7/oEfNeu3vgxSwOwQXKsM3S0nt0udpgXHC6lq4l+rQ7STJuIRqvzm8dMW9lbthww+6tUIguJ0kf1iNbMkvcNt5WS78WesJsGOR+bjspXQ09shZAWXd68mY61rlZAY8MXXByAV1k6xZOZuNavOnomnu8SSm69GxHL8JBw12FcwH3AJxpr5pv5FBMSdcYL1UuBRw+k7yMGoiLNfFSoIa+B9Z3xGM8k4496cG4WtTprk04VCyHOTRYJqeHwfX+VDVWacKaFijnfmKx4cbIuLqQCB3b7OKXDqq6A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3YWCPE3QJL1q8pUPyPgguKhxWpexD9mZ6X8ITP8r0ec=; b=eJW1bCDVet0qHmRxpPzpGrljojiygBg5UTO5PW1YgqCz6q2D36xpGGi7baMiAvG+2P/0G82wNEDpivjed4x2yMxFsD6VWUClz7LMTtDTiwWyhrGtWzqBIhjfBhslHYZrNPBdGUYJd4IjmF7GCQ/uUaBuFqhSUGJUaPhCBc3EW0ZK6LbZf+VixtZxq+Uz7Q0PpR603JXw/B29H8O3iOihtyiA+WRgnzAKMYtAFZiwHRtOsm3X/sMIjaIuAS/B9glVe7dBMUTB4jvq40MAQBLHKlmoMUob+qeG7A8CpWXL1rqRdqPIqJqrcst3giH+cOinnYAaakGGfbp7QQ62+kge+A== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:47 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:47 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:24 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [KPrQ6G7s7jqa9v6ICqk5QchEqKIW4EFD] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-4-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: 9dba03bc-8ddf-409d-b4df-08dc1b721abc X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1qs25E1wEZrYNY7HjUWH1wDaZVSsnDrj/NJQJoZgaCEOBMHepBUCbcI5LP4W+E7p+QcK/ho4+a9dGh2r8JOk3x1D5JR5PUG7+6Df/b/xRcJSQ5kjxj6LqacxNjwNB+J7Od2FGDejLlFiWIdvFusmmtwZWeyaGM20Cd3f/lqOnmzjdY8LHXX8FfoBOiaYS5bYaJ/IkNGxTav3L+GzZn/zsvu7oKBlkDPTRZVP9KL8BWCcRC/1aJuHiMUGbKb9rj8B/L6Eglzfs39T9z01gYHJZhmC5YgwfGwrTzSGYQOejcdLuGbAXiTK+5N2bHIU8rPwrVm3ZK8cNxIcu0jKoJTDQqVvSlkZ72j0Tj4OB6hLjTYCfBMseTCNsHUwcuoz36hzsHb/cEj4dMOcG+zkpTDx1Li81KeTqQd4kPqZ73O1I4WUdHzs1KsG4uDbYCcRrz9TUbNNMuqTw4ffg7XomdlxOcYTUsmuXQ+kj5PZJT2ynPWNw7Rzwnh1fCntaiUAZ1eZOQkwelyUkXCtsJFJLl2SoEaXoVnzmnrED/kfV61PBjWp8nmMbHbDKPHhVA0oT3gt6R/aX/JU6Q2a5HpeGmexgvG9cwHAWIQGRShPpm/XC/ID3dgeecFVsb9Uf6Mgym4o X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4QdL+HrSKTuf/Zh2eCGhO1WPWFQaLGo/bF1Cf4CaKpt7EuVDAxKGCDwBfwxi+SFMrPEGG6O1iLXDyI0/xiYS+gJOO77xmcWz3RjLndgmze9UYRey7qKln+oJiB36UfCWx6EpzmzbDWKntwqg9+7CW3uYLyHDHViwN0n4svGjRh8RgSvtT2eKIJhvm7jORHeokyod8GK8nofWuDDK+tmE+ibMkc8y/GxZj2AN3xskVFt+R3l8LuAMf6FmtwPxyyvq+ihouoWsVWE/IAaN29GAnoKYm8nu8MxAvtWhvZnKahpmevWDMT8U4tuteAJ23v+/CihtanTtW76jbLMYTQ7n1sz8PTHjheWBouMuOuYTPwcKpKyTm0kCVuk+ljOeKF0D/dnOe+5F5j3cUJPTMiAoXVp8TbhU60L57xONVCRP6vZtxkr9wtWy134krtY4SwrPMUMqzxUADoBaeo9hp8Gc6Ps3EFOCFAliCPhs/E82bNPOKMKNE5X052ZiKTnPBLAHmV6kqSgiRm3i6qNg7nygH0S8mpqihjPLy5zP8xIKRdPj0QSTYUHPcP8zFXCW+eZRdebp0g1UH7qDd3JWiHu18NS6T7sCvA+3LiIQZffo/EP9r+H8snubV3Zcpo8BzrejKzTifZQeyLDR8DO4f05S3ApDXdGptStAdzwIV5Ws0zTa6u41bwviAWkNxw0fOQ4Wiv7fK48itF3GyhJMbSnHWN/CrQbimdYaBDci13ERHeBnFuweJhB5TPXptZGEgcogAHiY2SvuGO93cnwxWCjuVxDt2peiskbJzhGlTDKzMX5j9QIEqz7uRyOIckwzYjY8LNcJPVX1bBbnHPdkma58zwni2h0huE5s7rgia3CzPXprU2eD19pylukIV2I9YoKCqWCUS2vfhbLq+5YXIXwU7Gd5J+53rpkrcTBY2Tq5L5+qp66acn0iVsW/3TzckHXYmxmqjtOqeRJMmeuU2PKTNYhGZtlLDmBmTBZgPJy1fO3ynMIJXc1xZaD3GlCu+AUfcSQjkEvOcC3IwmQQzvaihoBJ6nES6MKiXeaG5Pdtlz4j5L4rtPcaJS8OUl6b9/wRhKEqURrvPvvNjQQg9TXwSplLGqnAF2mKbCx/1xRe/GB72XW9lDPXVDObQSHzQjyhuw8bmaignzT2jVcAVF/xv6k7ObMtWyeoHZKTvoehKdPic/iLAjprqh8yJe4fH1X6FSkDCtwsVHNZrWIN0JjBy6Tc899usYI73p3+hzx0j9k= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9dba03bc-8ddf-409d-b4df-08dc1b721abc X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:47.0863 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 4/8] avcodec/x86/h26x/h2656_inter: add dststride to put 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Zw4laQKysjkF From: Wu Jianhua Signed-off-by: Wu Jianhua --- libavcodec/x86/h26x/h2656_inter.asm | 32 ++++++++++++++--------------- libavcodec/x86/h26x/h2656dsp.c | 4 ++-- libavcodec/x86/h26x/h2656dsp.h | 2 +- libavcodec/x86/hevcdsp_init.c | 2 +- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/libavcodec/x86/h26x/h2656_inter.asm b/libavcodec/x86/h26x/h2656_inter.asm index aa296d549c..cbba0c1ea5 100644 --- a/libavcodec/x86/h26x/h2656_inter.asm +++ b/libavcodec/x86/h26x/h2656_inter.asm @@ -22,8 +22,6 @@ ; */ %include "libavutil/x86/x86util.asm" -%define MAX_PB_SIZE 64 - SECTION_RODATA 32 cextern pw_255 cextern pw_512 @@ -342,7 +340,7 @@ SECTION .text %endmacro %macro LOOP_END 3 - add %1q, 2*MAX_PB_SIZE ; dst += dststride + add %1q, dststrideq ; dst += dststride add %2q, %3q ; src += srcstride dec heightd ; cmp height jnz .loop ; height loop @@ -539,7 +537,7 @@ SECTION .text ; ****************************** -; void %1_put_pixels(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; void %1_put_pixels(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, ; int height, const int8_t *hf, const int8_t *vf, int width) ; ****************************** @@ -549,7 +547,7 @@ SECTION .text %endmacro %macro MC_PIXELS 3 -cglobal %1_put_pixels%2_%3, 4, 4, 3, dst, src, srcstride, height +cglobal %1_put_pixels%2_%3, 5, 5, 3, dst, dststride, src, srcstride, height pxor m2, m2 .loop: SIMPLE_LOAD %2, %3, srcq, m0 @@ -579,10 +577,10 @@ cglobal %1_put_uni_pixels%2_%3, 5, 5, 2, dst, dststride, src, srcstride, height %endif ; ****************************** -; void %1_put_4tap_hX(int16_t *dst, +; void %1_put_4tap_hX(int16_t *dst, ptrdiff_t dststride, ; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width); ; ****************************** -cglobal %1_put_4tap_h%2_%3, 5, 5, XMM_REGS, dst, src, srcstride, height, hf +cglobal %1_put_4tap_h%2_%3, 6, 6, XMM_REGS, dst, dststride, src, srcstride, height, hf %assign %%stride ((%3 + 7)/8) MC_4TAP_FILTER %3, hf, m4, m5 .loop: @@ -612,10 +610,10 @@ cglobal %1_put_uni_4tap_h%2_%3, 6, 7, XMM_REGS, dst, dststride, src, srcstride, RET ; ****************************** -; void %1_put_4tap_v(int16_t *dst, +; void %1_put_4tap_v(int16_t *dst, ptrdiff_t dststride, ; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width) ; ****************************** -cglobal %1_put_4tap_v%2_%3, 6, 6, XMM_REGS, dst, src, srcstride, height, r3src, vf +cglobal %1_put_4tap_v%2_%3, 7, 7, XMM_REGS, dst, dststride, src, srcstride, height, r3src, vf sub srcq, srcstrideq MC_4TAP_FILTER %3, vf, m4, m5 lea r3srcq, [srcstrideq*3] @@ -649,10 +647,10 @@ cglobal %1_put_uni_4tap_v%2_%3, 7, 7, XMM_REGS, dst, dststride, src, srcstride, %macro PUT_4TAP_HV 3 ; ****************************** -; void put_4tap_hv(int16_t *dst, +; void put_4tap_hv(int16_t *dst, ptrdiff_t dststride, ; const uint8_t *_src, ptrdiff_t _srcstride, int height, int8_t *hf, int8_t *vf, int width) ; ****************************** -cglobal %1_put_4tap_hv%2_%3, 6, 7, 16 , dst, src, srcstride, height, hf, vf, r3src +cglobal %1_put_4tap_hv%2_%3, 7, 8, 16 , dst, dststride, src, srcstride, height, hf, vf, r3src %assign %%stride ((%3 + 7)/8) sub srcq, srcstrideq MC_4TAP_HV_FILTER %3 @@ -784,12 +782,12 @@ cglobal %1_put_uni_4tap_hv%2_%3, 7, 8, 16 , dst, dststride, src, srcstride, heig %endmacro ; ****************************** -; void put_8tap_hX_X_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; void put_8tap_hX_X_X(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, ; int height, const int8_t *hf, const int8_t *vf, int width) ; ****************************** %macro PUT_8TAP 3 -cglobal %1_put_8tap_h%2_%3, 5, 5, 16, dst, src, srcstride, height, hf +cglobal %1_put_8tap_h%2_%3, 6, 6, 16, dst, dststride, src, srcstride, height, hf MC_8TAP_FILTER %3, hf .loop: MC_8TAP_H_LOAD %3, srcq, %2, 10 @@ -824,10 +822,10 @@ cglobal %1_put_uni_8tap_h%2_%3, 6, 7, 16 , dst, dststride, src, srcstride, heigh ; ****************************** -; void put_8tap_vX_X_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; void put_8tap_vX_X_X(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, ; int height, const int8_t *hf, const int8_t *vf, int width) ; ****************************** -cglobal %1_put_8tap_v%2_%3, 6, 8, 16, dst, src, srcstride, height, r3src, vf +cglobal %1_put_8tap_v%2_%3, 7, 8, 16, dst, dststride, src, srcstride, height, r3src, vf MC_8TAP_FILTER %3, vf lea r3srcq, [srcstrideq*3] .loop: @@ -866,11 +864,11 @@ cglobal %1_put_uni_8tap_v%2_%3, 7, 9, 16, dst, dststride, src, srcstride, height ; ****************************** -; void put_8tap_hvX_X(int16_t *dst, const uint8_t *_src, ptrdiff_t srcstride, +; void put_8tap_hvX_X(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t srcstride, ; int height, const int8_t *hf, const int8_t *vf, int width) ; ****************************** %macro PUT_8TAP_HV 3 -cglobal %1_put_8tap_hv%2_%3, 6, 7, 16, 0 - mmsize*16, dst, src, srcstride, height, hf, vf, r3src +cglobal %1_put_8tap_hv%2_%3, 7, 8, 16, 0 - mmsize*16, dst, dststride, src, srcstride, height, hf, vf, r3src MC_8TAP_FILTER %3, hf, 0 lea hfq, [rsp] MC_8TAP_FILTER %3, vf, 8*mmsize diff --git a/libavcodec/x86/h26x/h2656dsp.c b/libavcodec/x86/h26x/h2656dsp.c index 27769f9c55..7ef1234936 100644 --- a/libavcodec/x86/h26x/h2656dsp.c +++ b/libavcodec/x86/h26x/h2656dsp.c @@ -24,7 +24,7 @@ #include "h2656dsp.h" #define mc_rep_func(name, bitd, step, W, opt) \ -void ff_h2656_put_##name##W##_##bitd##_##opt(int16_t *_dst, \ +void ff_h2656_put_##name##W##_##bitd##_##opt(int16_t *_dst, ptrdiff_t dststride, \ const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width) \ { \ int i; \ @@ -32,7 +32,7 @@ void ff_h2656_put_##name##W##_##bitd##_##opt(int16_t *_dst, for (i = 0; i < W; i += step) { \ const uint8_t *src = _src + (i * ((bitd + 7) / 8)); \ dst = _dst + i; \ - ff_h2656_put_##name##step##_##bitd##_##opt(dst, src, _srcstride, height, hf, vf, width); \ + ff_h2656_put_##name##step##_##bitd##_##opt(dst, dststride, src, _srcstride, height, hf, vf, width); \ } \ } diff --git a/libavcodec/x86/h26x/h2656dsp.h b/libavcodec/x86/h26x/h2656dsp.h index 8a2ab13607..e31aae6b0d 100644 --- a/libavcodec/x86/h26x/h2656dsp.h +++ b/libavcodec/x86/h26x/h2656dsp.h @@ -30,7 +30,7 @@ #include #define H2656_PEL_PROTOTYPE(name, D, opt) \ -void ff_h2656_put_ ## name ## _ ## D ## _##opt(int16_t *dst, const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width); \ +void ff_h2656_put_ ## name ## _ ## D ## _##opt(int16_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width); \ void ff_h2656_put_uni_ ## name ## _ ## D ## _##opt(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, const int8_t *hf, const int8_t *vf, int width); \ #define H2656_MC_8TAP_PROTOTYPES(fname, bitd, opt) \ diff --git a/libavcodec/x86/hevcdsp_init.c b/libavcodec/x86/hevcdsp_init.c index 5c19330e19..e0dc82eef0 100644 --- a/libavcodec/x86/hevcdsp_init.c +++ b/libavcodec/x86/hevcdsp_init.c @@ -96,7 +96,7 @@ void ff_hevc_put_hevc_ ## a ## _ ## depth ## _##opt(int16_t *dst, const uint8_t int height, intptr_t mx, intptr_t my,int width) \ { \ DECL_HV_FILTER(p) \ - ff_h2656_put_ ## b ## _ ## depth ## _##opt(dst, src, srcstride, height, hf, vf, width); \ + ff_h2656_put_ ## b ## _ ## depth ## _##opt(dst, 2 * MAX_PB_SIZE, src, srcstride, height, hf, vf, width); \ } #define FW_PUT_UNI(p, a, b, depth, opt) \ From patchwork Mon Jan 22 17:46:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45721 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130459pzf; Mon, 22 Jan 2024 09:47:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IH3w9/lpTx6JeL+8HS4pYyBJB69tKsBmecLG57FG5quoOWCMMC1VkINqER+XkkuUaxTN4bw X-Received: by 2002:a7b:c848:0:b0:40e:5850:e525 with SMTP id c8-20020a7bc848000000b0040e5850e525mr2514258wml.167.1705945660791; Mon, 22 Jan 2024 09:47:40 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m25-20020a50c199000000b0055972f6452asi7292928edf.576.2024.01.22.09.47.40; Mon, 22 Jan 2024 09:47:40 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=AH316Wmx; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0EB4F68D0CF; Mon, 22 Jan 2024 19:47:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2017.outbound.protection.outlook.com [40.92.99.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3A26668D0CE for ; Mon, 22 Jan 2024 19:47:01 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=X4Y2D5EsZqT+JOZ1h0Ch0pgM4vv6rA6XtWcufk6uKaXnwRkMjrPXrNoLZOIPhu4JgFy8bNGCpt+Qs85/gByBD2J6CnkggD2PvtwuGGqyIY6lhW7kWYMeT1iwrnFzO84wqubVxxd9mspR/QWC4sGHr3+Vb5NH/jwH28uHPHmECg23UIFn0LKRSCc1oxzSZLqtejWeAnnIRiJqsj2K0orkIHfg6R7NmZCrrqwl17dmwSSsoqEge95r7UWm93Dth2Vk8EK7Send+58P741ye+T+6wSuL0L+CW9ffA7lSjjQ4l3hQTPPE5PgPB7PVjS6KExJ2diqjqvT4w5liOg8oittDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=KcIMgBFyu8ErRgoqm8Wlx2gTR2EPZpHErXlpYlPSIGE=; b=gZ1gzyvPu4bn2RQ5OnJm+efr6UUg9DR8nz5zoQJ37kW4lZIiYHc2Kzdz44XCdQg6qrEWtmFcoq3Xcug6wJN2V9PMz19jZKUwgkn+nfwKygSVr5uOZCbn9RNZ7KGctu0K1wW+2rHrNENyBPRvu2myV3KvuXIS8phWml3t7+LMknY29QJCP5tYCPq8rlvn/GSRWKgIni5IJpsCSVkHXyltCWBxFRBN6tvN7kvk/aWU79mMTLHY8olvMaU9+5mma6vkBlFl8IG5DmfVMuU4T2McUG+QeyAMsfNbewgA8tsEWYQzjfQ2Dl8en03kt4IAkvVxdYuiVVaV5Lzmb50XTscA7g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KcIMgBFyu8ErRgoqm8Wlx2gTR2EPZpHErXlpYlPSIGE=; b=AH316WmxYEHVPYp1NqCSYE41sUmv/7rdgERdnm7KO423yFDBQeJSBCpLwTPewNKZfkJ5wFsnTUdYJHn5TITyQqZf07+TgLicRxKjZJwqYyptKOJK7Oy/Rrkwv4/DR1EcRa+RYFGFYdgbiJX0Z1sVCf/hbplzAMd+hfTGBR2w2MUkIsP4nkCEvwWQUxhXQMhTCsGKwBdI5J4r3V9kdv/my+WtlV7gYNpOzlVgVx7fi2awAoPdJ9zChZdxeguB1thc4p4D/fJnFf6N89hk720VgmBwp22vbZWzS2Dz+/pnZUKRWyEPhcLUAxI1iC1xSrBPTxawgmOnUT7/d9I5xd66cw== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:48 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:48 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:25 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [VwHGVLlOvHdY+lfn+yvqr3EJrGso8tmo] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-5-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: 7f5df320-b0dc-4f27-deef-08dc1b721b5a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: SXCFB8D7EMMUQivOXfKgTW7e8BjXC+KziB0dEMvVScw/viNwj719bM78Xy2YncYrDzWsGGNeCS88Xw8Zcb4f3ds+5yr53NVnC6W6lDwqOuFZ/lOlyF3EKHPMYnWyXQCuekyNuLat6k1T4M78/8pTE4dJdJsQLM5XuuRm/x/lNu/ZfJTsPtirTfViOmJhdnFAISRxB7t0gZ5b1L3KX+RkrEljK+coMJ9545chj6JgUCW2J/Mazyyqerl+nGOl02yKPrmu6ynQSo+qfNyDxCip1W/7DyglfQuhxCyZjer8Tn3ilgU0nxKglTun+9Juxz1ZkVTh+39N31R3/1ZhXgwNqQB00bfHdhNxh27ojzlmqRt2rjDWuT3SV/GYu5g4Tv9LyDupib6VgnfRoH3jKI7hBk2WSsQQBD4gkPmn4tBooMYymt2aD1qoFReUcrPPBI5gGxFZAF2oxfJOkxMyeroCQUXKQW0uJR8UvMWzZTSg+2zTfdtPiyJ9xDNdb6AAPTBjOJ9NnLn+WTw1LwGTgHucaO8s5QGJbMwiWH6lztaGebPfDoKvY4ExZdThiCOQLmTtFY5QC4ltfYMdhE9EhGzwy6hGJD7OHugOFFnXY1Hn0zCTQ8qT7dVok6u0q0xL4NHG X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: uf37Aa+HpjedqvK5Ffo0DMbx0wRPc/IUfsvsnmEzp+dBJIB3+ANcWfAEWLznho/xruLjem3FGCPltzRFCupwYcdcGXZmDXYb3JwgaFarOsUkz8f/T/kZounaalu3mGLYbJusBhIFv46Rq98Zj/WaSzdrrQh8UE6YIuYf9xcb5EJ/P4s1HVM0wR9i1IYjYdPv9p5TtBYIi+8e8klOgQlpRYXCJN9x/TpP7iZNicxNcFs2tI8xdPMnSU4CorE5ajPsi8SR4l3vjjfXI3wZp+3yDTIApehWCve+7TyoUdVV5HrFBCgOXDMKhA/Fqo/wXAHaUiwI0gHpVg2LT0O/AiRgUSXy31OEBmknkxTzCdA/Qm3WqL5aSJsQZOi8Flt4GQ/HCvCX9KV2y1DU1Y79E0aonU1qO3I1YjpxyW6u5ii32ZaQRIJbytbOoMCvVB/R/YzQuxT2Q3749T7X3wg0ylc2FhE8kDOLih/yUevvk/UdI7mKT32GJAOLg5Dd/bcl3OTsox24s0qRqJ3rBPb6pI8txP1fk5FbnO8ntj/PsbOphwWdre6NITBVi6a3OWM2kqH00wcWkHtqxBgRa8FMQ0yQz49ohJ4Lz1iD/LrFntJxuGKsVRPhQ/S0waSiqOx0ITAyGYDCqAlwAF5qXpo4Q7Icqa69xsBf5uBtGsgdSrzPRyhJQ0Yhl2GEM1Hqt5jWmP1YI+TLEEr/heLjBs5SBhfbMiCYR8Zdv8/UU+S5IP5Nhp6zONahmLcByGQQY+ijKgJYPCyCpS3HN2k6cNQ7gFgSQUdljaLYDgAOTYiWys/FaZwFnyuI7iQcSV4G4Jo1UAEoURBnnGjxaNYzkVyOSe+UCs/i7SIP7DcMAM2NYD9J46QZEDGVFYmh5B6lQNjmKMcKm8/wq43UKxfipM5xIlmxEfHADtnrIjfO7AwpfqlPs/i0Gcv0z9VEN5u3iMFbTYPvkFXRayzM5bddsoir55Ef6GxZGn1AphmsrB7cZG2A6zcCIGBLOtG+LaphzTAD/1QbwMxUrGf6aog5BrTV4PDJ96IjDELoXJaHR8EhIc+UxfZG3ovocQ6Z7fp45ojiQh+Wixg5cwsOY8rccI1TS6WlZU+5vFHWOZK1N7MhBmJp1Z2V4JIEWVLABuryaWIGeSSWIgtAAanzIqKvHX0O4ysulwuVB2BmYLrlNG8vdnInaNXN9EzgEcG+JV9UCBaeUajK7jY2u84K0QPIauyoQjQLyzhPX+K+q0JInd9pGXUWg3s= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7f5df320-b0dc-4f27-deef-08dc1b721b5a X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:48.1014 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 5/8] avcodec/vvcdec: reuse h26x/2656_inter.asm to enable x86 optimizations 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KEIwyoRfbjGv From: Wu Jianhua Signed-off-by: Wu Jianhua --- libavcodec/Makefile | 1 + libavcodec/vvc/vvcdsp.c | 4 + libavcodec/vvc/vvcdsp.h | 2 + libavcodec/x86/vvc/Makefile | 6 + libavcodec/x86/vvc/vvcdsp_init.c | 202 +++++++++++++++++++++++++++++++ 5 files changed, 215 insertions(+) create mode 100644 libavcodec/x86/vvc/Makefile create mode 100644 libavcodec/x86/vvc/vvcdsp_init.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index bb42095165..ce33631b60 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -65,6 +65,7 @@ OBJS = ac3_parser.o \ # subsystems include $(SRC_PATH)/libavcodec/vvc/Makefile +include $(SRC_PATH)/libavcodec/x86/vvc/Makefile OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o OBJS-$(CONFIG_AC3DSP) += ac3dsp.o ac3.o ac3tab.o OBJS-$(CONFIG_ADTS_HEADER) += adts_header.o mpeg4audio_sample_rates.o diff --git a/libavcodec/vvc/vvcdsp.c b/libavcodec/vvc/vvcdsp.c index c82ea7be30..c542be5258 100644 --- a/libavcodec/vvc/vvcdsp.c +++ b/libavcodec/vvc/vvcdsp.c @@ -138,4 +138,8 @@ void ff_vvc_dsp_init(VVCDSPContext *vvcdsp, int bit_depth) VVC_DSP(8); break; } + +#if ARCH_X86 + ff_vvc_dsp_init_x86(vvcdsp, bit_depth); +#endif } diff --git a/libavcodec/vvc/vvcdsp.h b/libavcodec/vvc/vvcdsp.h index b5a63c5833..6f59e73654 100644 --- a/libavcodec/vvc/vvcdsp.h +++ b/libavcodec/vvc/vvcdsp.h @@ -167,4 +167,6 @@ typedef struct VVCDSPContext { void ff_vvc_dsp_init(VVCDSPContext *hpc, int bit_depth); +void ff_vvc_dsp_init_x86(VVCDSPContext *hpc, const int bit_depth); + #endif /* AVCODEC_VVC_VVCDSP_H */ diff --git a/libavcodec/x86/vvc/Makefile b/libavcodec/x86/vvc/Makefile new file mode 100644 index 0000000000..b4acc22501 --- /dev/null +++ b/libavcodec/x86/vvc/Makefile @@ -0,0 +1,6 @@ +clean:: + $(RM) $(CLEANSUFFIXES:%=libavcodec/x86/vvc/%) + +OBJS-$(CONFIG_VVC_DECODER) += x86/vvc/vvcdsp_init.o +X86ASM-OBJS-$(CONFIG_VVC_DECODER) += x86/h26x/h2656dsp.o \ + x86/h26x/h2656_inter.o diff --git a/libavcodec/x86/vvc/vvcdsp_init.c b/libavcodec/x86/vvc/vvcdsp_init.c new file mode 100644 index 0000000000..c197cdb4cc --- /dev/null +++ b/libavcodec/x86/vvc/vvcdsp_init.c @@ -0,0 +1,202 @@ +/* + * VVC DSP init for x86 + * + * Copyright (C) 2022-2024 Nuo Mi + * Copyright (c) 2023-2024 Wu Jianhua + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include "libavutil/cpu.h" +#include "libavutil/x86/asm.h" +#include "libavutil/x86/cpu.h" +#include "libavcodec/vvc/vvcdec.h" +#include "libavcodec/vvc/vvc_ctu.h" +#include "libavcodec/vvc/vvcdsp.h" +#include "libavcodec/x86/h26x/h2656dsp.h" + +#define FW_PUT(name, depth, opt) \ +static void ff_vvc_put_ ## name ## _ ## depth ## _##opt(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, \ + int height, const int8_t *hf, const int8_t *vf, int width) \ +{ \ + ff_h2656_put_## name ## _ ## depth ## _##opt(dst, 2 * MAX_PB_SIZE, src, srcstride, height, hf, vf, width); \ +} + +#define FW_PUT_TAP(fname, bitd, opt ) \ + FW_PUT(fname##4, bitd, opt ); \ + FW_PUT(fname##8, bitd, opt ); \ + FW_PUT(fname##16, bitd, opt ); \ + FW_PUT(fname##32, bitd, opt ); \ + FW_PUT(fname##64, bitd, opt ); \ + FW_PUT(fname##128, bitd, opt ); \ + +#define FW_PUT_4TAP(fname, bitd, opt) \ + FW_PUT(fname ## 2, bitd, opt) \ + FW_PUT_TAP(fname, bitd, opt) + +#define FW_PUT_4TAP_SSE4(bitd) \ + FW_PUT_4TAP(pixels, bitd, sse4) \ + FW_PUT_4TAP(4tap_h, bitd, sse4) \ + FW_PUT_4TAP(4tap_v, bitd, sse4) \ + FW_PUT_4TAP(4tap_hv, bitd, sse4) + +#define FW_PUT_8TAP_SSE4(bitd) \ + FW_PUT_TAP(8tap_h, bitd, sse4) \ + FW_PUT_TAP(8tap_v, bitd, sse4) \ + FW_PUT_TAP(8tap_hv, bitd, sse4) + +#define FW_PUT_SSE4(bitd) \ + FW_PUT_4TAP_SSE4(bitd) \ + FW_PUT_8TAP_SSE4(bitd) + +FW_PUT_SSE4( 8); +FW_PUT_SSE4(10); +FW_PUT_SSE4(12); + +#define FW_PUT_TAP_AVX2(n, bitd) \ + FW_PUT(n ## tap_h32, bitd, avx2) \ + FW_PUT(n ## tap_h64, bitd, avx2) \ + FW_PUT(n ## tap_h128, bitd, avx2) \ + FW_PUT(n ## tap_v32, bitd, avx2) \ + FW_PUT(n ## tap_v64, bitd, avx2) \ + FW_PUT(n ## tap_v128, bitd, avx2) + +#define FW_PUT_AVX2(bitd) \ + FW_PUT(pixels32, bitd, avx2) \ + FW_PUT(pixels64, bitd, avx2) \ + FW_PUT(pixels128, bitd, avx2) \ + FW_PUT_TAP_AVX2(4, bitd) \ + FW_PUT_TAP_AVX2(8, bitd) \ + +FW_PUT_AVX2( 8) +FW_PUT_AVX2(10) +FW_PUT_AVX2(12) + +#define FW_PUT_TAP_16BPC_AVX2(n, bitd) \ + FW_PUT(n ## tap_h16, bitd, avx2) \ + FW_PUT(n ## tap_v16, bitd, avx2) \ + FW_PUT(n ## tap_hv16, bitd, avx2) \ + FW_PUT(n ## tap_hv32, bitd, avx2) \ + FW_PUT(n ## tap_hv64, bitd, avx2) \ + FW_PUT(n ## tap_hv128, bitd, avx2) + +#define FW_PUT_16BPC_AVX2(bitd) \ + FW_PUT(pixels16, bitd, avx2) \ + FW_PUT_TAP_16BPC_AVX2(4, bitd) \ + FW_PUT_TAP_16BPC_AVX2(8, bitd); + +FW_PUT_16BPC_AVX2(10); +FW_PUT_16BPC_AVX2(12); + +#define PEL_LINK(dst, C, W, idx1, idx2, name, D, opt) \ + dst[C][W][idx1][idx2] = ff_vvc_put_## name ## _ ## D ## _##opt; \ + dst ## _uni[C][W][idx1][idx2] = ff_h2656_put_uni_ ## name ## _ ## D ## _##opt; \ + +#define MC_TAP_LINKS(pointer, C, my, mx, fname, bitd, opt ) \ + PEL_LINK(pointer, C, 1, my , mx , fname##4 , bitd, opt ); \ + PEL_LINK(pointer, C, 2, my , mx , fname##8 , bitd, opt ); \ + PEL_LINK(pointer, C, 3, my , mx , fname##16, bitd, opt ); \ + PEL_LINK(pointer, C, 4, my , mx , fname##32, bitd, opt ); \ + PEL_LINK(pointer, C, 5, my , mx , fname##64, bitd, opt ); \ + PEL_LINK(pointer, C, 6, my , mx , fname##128, bitd, opt ); + +#define MC_8TAP_LINKS(pointer, my, mx, fname, bitd, opt) \ + MC_TAP_LINKS(pointer, LUMA, my, mx, fname, bitd, opt) + +#define MC_8TAP_LINKS_SSE4(bd) \ + MC_8TAP_LINKS(c->inter.put, 0, 0, pixels, bd, sse4); \ + MC_8TAP_LINKS(c->inter.put, 0, 1, 8tap_h, bd, sse4); \ + MC_8TAP_LINKS(c->inter.put, 1, 0, 8tap_v, bd, sse4); \ + MC_8TAP_LINKS(c->inter.put, 1, 1, 8tap_hv, bd, sse4) + +#define MC_4TAP_LINKS(pointer, my, mx, fname, bitd, opt) \ + PEL_LINK(pointer, CHROMA, 0, my , mx , fname##2 , bitd, opt ); \ + MC_TAP_LINKS(pointer, CHROMA, my, mx, fname, bitd, opt) \ + +#define MC_4TAP_LINKS_SSE4(bd) \ + MC_4TAP_LINKS(c->inter.put, 0, 0, pixels, bd, sse4); \ + MC_4TAP_LINKS(c->inter.put, 0, 1, 4tap_h, bd, sse4); \ + MC_4TAP_LINKS(c->inter.put, 1, 0, 4tap_v, bd, sse4); \ + MC_4TAP_LINKS(c->inter.put, 1, 1, 4tap_hv, bd, sse4) + +#define MC_LINK_SSE4(bd) \ + MC_4TAP_LINKS_SSE4(bd) \ + MC_8TAP_LINKS_SSE4(bd) + +#define MC_TAP_LINKS_AVX2(C,tap,bd) do { \ + PEL_LINK(c->inter.put, C, 4, 0, 0, pixels32, bd, avx2) \ + PEL_LINK(c->inter.put, C, 5, 0, 0, pixels64, bd, avx2) \ + PEL_LINK(c->inter.put, C, 6, 0, 0, pixels128, bd, avx2) \ + PEL_LINK(c->inter.put, C, 4, 0, 1, tap##tap_h32, bd, avx2) \ + PEL_LINK(c->inter.put, C, 5, 0, 1, tap##tap_h64, bd, avx2) \ + PEL_LINK(c->inter.put, C, 6, 0, 1, tap##tap_h128, bd, avx2) \ + PEL_LINK(c->inter.put, C, 4, 1, 0, tap##tap_v32, bd, avx2) \ + PEL_LINK(c->inter.put, C, 5, 1, 0, tap##tap_v64, bd, avx2) \ + PEL_LINK(c->inter.put, C, 6, 1, 0, tap##tap_v128, bd, avx2) \ + } while (0) + +#define MC_LINKS_AVX2(bd) \ + MC_TAP_LINKS_AVX2(LUMA, 8, bd); \ + MC_TAP_LINKS_AVX2(CHROMA, 4, bd); + +#define MC_TAP_LINKS_16BPC_AVX2(C, tap, bd) do { \ + PEL_LINK(c->inter.put, C, 3, 0, 0, pixels16, bd, avx2) \ + PEL_LINK(c->inter.put, C, 3, 0, 1, tap##tap_h16, bd, avx2) \ + PEL_LINK(c->inter.put, C, 3, 1, 0, tap##tap_v16, bd, avx2) \ + PEL_LINK(c->inter.put, C, 3, 1, 1, tap##tap_hv16, bd, avx2) \ + PEL_LINK(c->inter.put, C, 4, 1, 1, tap##tap_hv32, bd, avx2) \ + PEL_LINK(c->inter.put, C, 5, 1, 1, tap##tap_hv64, bd, avx2) \ + PEL_LINK(c->inter.put, C, 6, 1, 1, tap##tap_hv128, bd, avx2) \ + } while (0) + +#define MC_LINKS_16BPC_AVX2(bd) \ + MC_TAP_LINKS_16BPC_AVX2(LUMA, 8, bd); \ + MC_TAP_LINKS_16BPC_AVX2(CHROMA, 4, bd); + +void ff_vvc_dsp_init_x86(VVCDSPContext *const c, const int bd) +{ + const int cpu_flags = av_get_cpu_flags(); + + if (ARCH_X86_64) { + if (bd == 8) { + if (EXTERNAL_SSE4(cpu_flags)) { + MC_LINK_SSE4(8); + } + if (EXTERNAL_AVX2_FAST(cpu_flags)) { + MC_LINKS_AVX2(8); + } + } else if (bd == 10) { + if (EXTERNAL_SSE4(cpu_flags)) { + MC_LINK_SSE4(10); + } + if (EXTERNAL_AVX2_FAST(cpu_flags)) { + MC_LINKS_AVX2(10); + MC_LINKS_16BPC_AVX2(10); + } + } else if (bd == 12) { + if (EXTERNAL_SSE4(cpu_flags)) { + MC_LINK_SSE4(12); + } + if (EXTERNAL_AVX2_FAST(cpu_flags)) { + MC_LINKS_AVX2(12); + MC_LINKS_16BPC_AVX2(12); + } + } + } +} From patchwork Mon Jan 22 17:46:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45722 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130536pzf; Mon, 22 Jan 2024 09:47:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IHbKPvw8DliEDUpogokfcZKYCacEkdaA21ItcIKTe37MK8csVK3HY1mubX7b8zael7vqcWk X-Received: by 2002:a17:907:a803:b0:a2e:d6af:a9c4 with SMTP id vo3-20020a170907a80300b00a2ed6afa9c4mr2980995ejc.0.1705945670298; Mon, 22 Jan 2024 09:47:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x14-20020a170906b08e00b00a2d357a9c7bsi8972254ejy.747.2024.01.22.09.47.49; Mon, 22 Jan 2024 09:47:50 -0800 (PST) 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=@outlook.com header.s=selector1 header.b="q/Uofd/l"; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3E5B768CBC3; Mon, 22 Jan 2024 19:47:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2066.outbound.protection.outlook.com [40.92.99.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B0C2468D0C9 for ; Mon, 22 Jan 2024 19:47:06 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=G2/O9zaim9cV80QHLN//v0B1XaafHH1ljrBSNLbC9E5kdRK6l3TIrLAPDJNj/+UzCfbqEIL0eJ510tiCSV0P1RKtU+AMDMKf2M6M3C8B2JP8O2ufwvCQDJKLCOw+vsdmT6tO/SoDwP04MzY+xuBuzY8mMru100HoCudPo6y3h+SzuE8VP9r9JRFCqAuNCQ2An873dRWCcxQBmyEXujxeXijQB1xLzxCYTd3DMY5JgyLXY3NcfL2AQtHnpiu2A3Q4SWMgoYsOYIqbFUddaLlgS8IE7sk/xh9pOS2U//2qVnOQ1LVUPAkFU/a59XwTXBULHYrhwNhQw8E06AEw54P6qg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zxEAedgkVuSP+mUoX7+Dpg6+I1RVSBRC5spffGTIJxU=; b=JGmGMuiTJQweV2RD4TjNqqDnDglffKQBH67abzDASDk5M/Tyv/O/yFN0qwScW19oLS4PdcE4RiLvGaenfmI9kTv0jelXyzY2W6lmOgD1W2eNccw4KiL8gmrOWwBrghZEzaCiQtBFhC49Hnxz2wIkCYlNL3CXhV9L8DWguw9yMGltnD6AlIcMBm64pUykF2bXYOnNQFuICCeJ2eXNHt2rH8s+x8/RQQHvqQYqC0FCl25tiQlCKZ2RPaycWLntf/0C2xg2AbB+SKUcgJFkf0qNR5PGNLbeS/50KMgL/LDoKCaqlCAyp3YD9T/BMN0AMwX/Byi2PpKwnWElc4HQfr2/0Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zxEAedgkVuSP+mUoX7+Dpg6+I1RVSBRC5spffGTIJxU=; b=q/Uofd/l+287csR18hllyrISpxz8G9tkA1hiogREYDdfSzUb7v+VAnGmQmsWpubHjlHyI/QuidoISGO1N3kxPCDc6FK469g3uVujH7YGmSWeVSYwa57b7isgjMOGR2oXYlO1jM4Gbp7BeFnySomobeYv22Qx+caBs1DLyIo6Q1EXQnUZTAjJtMy4OFTaB6OElAuqTJ9uwHbdYHJaQAc1Zm4Yv8rugMnt6/LUvY2toW7jVZoTEqlw/DDkvPt5+/h/bsntuRa+TqZ+aEdq+/0x0tZQywBjbKUV7KodkWNalC9/PMm7IT/o0Ld48WxG53XPqPoxZycLYIWn0H3UeyMCiw== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:49 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:49 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:26 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [8QATTm54YvNFwIKAkRKBsMfVyyxJojrD] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-6-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: 735b06aa-ada6-4e1f-b500-08dc1b721bf5 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WHrkc+Bop87xDiXZ4CpMISKfHiIB1PPPwO6CbJQtptoazqX2lPLbp/EotPPjuhqKX6HmDr86ffJRSVG2+dVfxnSNg8rsotXoMTskem+55XZZrLKtN4sRCX4/rxYTYWw8OGAqN7QNWjDMT9rPE0MQXHYQDq63GtMXkP9qz2JwlDBiJtcfUkpygQsUPliKfV12em/RHbwVhsKSNZNdPj/1WEOUDCc2DpMxrMY0CqXRy0zztLx1mJLXqXxMUdJkA3DDDEegBu7rqC6ASl0HfvithkiANzKIebgx93vnrkeQu/NgQWtnv5liOPcJ72RlAzQnNxpWQJfKhx3h/gD2OZPFcIQy0GYDo3flq1Ro8miNVGA5H7YBqVVaSJJ8QSwKvAzCgiEpMXH/sNWPGelwtuTIAEQ09LLUzxPfKvT1yQVRBODbVzlfqbCiUO4WmOFYmoLmZMI8DLB4ijgyzIqc6/SXwuqt/bRgM8uEzCVqRdw+aNBTqMFTMY0DeJ7qhvhWZzUZ+1ameg79zyCqJw5pkNI1cL1K/HAQOJ+BtVK0T4OtzY6ljSrS1/MZmMO0hUxiNuGz9BK/nd0V259J+y1EI8YX6GWn1BbRf4J0Ew/dhvQWwMg= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: h77GLYYAnro0777zm111wu8opNabpH/KZJahQIDFvgVs5irEVYAZIw97K8CMEWPZ46swuTQKZE3NzXt6S3aGJvrD75jXXM3LK+ocJEH3CvR3D9Yh3fpMUzael6M14W7Qu5BZUmmTjssk2A6BfCNKCT999Ln37eyTX6gzvui4k8GOwxevlZt9Q6KxkE+UJH5vdV01pfr3ae25nO5yYrp89VzBz3bvNZVdXoSFHuBugv2NXHhA0Z75o/CS7N3KMpVr0RX4yKk7LizuEt0AfFCE1dkr54BNMQPWjsDBcci9Sp35BTa9mkbfENuGLxkhr2kdQpXGwPwYdlR2ozyJncvgkLmDjk5BThd6fT2gcZm0X82qUFfynkEQmVDLgYM35YcbvlU7RHO/14vC7SY1jj3hMydGvXw7J5CtD9FQ5GCmPtl6LFl4DK4uYk5Xb33qmmtoxbp5pF7f3oGKq6DfLR60W9Kn7usCiicGBnvmO4Nlme4jAnpXK18FgAYGhzR8no6IHJ+VXKBY0OtyauqqTVK7BouUr55aymbUUxcoOPmfTxZTAld2o6P6mJ2EWqGGNkr+P90PqTNHLz4xSZjoXyD5p0llF2wXjFkZMK4B8SCRkKyER+WQT4zN0dvFrwSSdR1U0gsykbemwWv1m7A5edViyhl0WYxsaRjM2Q9vTOagR8+b9TFMK6EjVvgkQwnc/l5+3vhxELw0iSkOF4zp3NwOkhZjjWqlgV1qddp/qCuGfMKiK9GCEpuPgi9qOvCdnDtR9NKVO4v42/jIfxqeQVLVIkW1ItIwUK+vECu/YO8ElTk0KFypRdM7JbgEIxA1BkWEs5a04PWVv1qyVXkCss/AtfLtJU1SgEgvYFCPC56vnvVW5F6tZqTJx5kejyD7W8pXp2YituZJZitKubqxLscFbIM9JdJ5VXGFqaGIG05AoZbnDLR3CcyEBb6e3XLsqJTI3+NXWaHoPVtmEbBJrDzp2t668T5NVyjtncS1yxxmIheIKRZMqcnbGQ1glnsB/AjRE8bfN3qz08gyhSS5k+BZSpIpXgu1o4NCcXidDEwpLs2KR3eeqkXMsKef8QsqFiro06gqjCL4fs+YSVUf3/6za4/F83cRBKDiapu//AwDEJfaOaTckpAQlJXJf+dHqiI6p5ZX+vHHEdftqxO7SjUWHjNavzdQpKe85L1VUkz16TE4X6otJBugGTBfeKkCgrjlltqxWVp0VzPfCTIw/lAvn4QjUI2Px5tvdG/Mm+iRcsc= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 735b06aa-ada6-4e1f-b500-08dc1b721bf5 X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:49.1170 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 6/8] tests/checkasm: add checkasm_check_vvc_mc 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: PuFySOUKNH1L From: Wu Jianhua Signed-off-by: Wu Jianhua --- tests/checkasm/Makefile | 1 + tests/checkasm/checkasm.c | 3 + tests/checkasm/checkasm.h | 1 + tests/checkasm/vvc_mc.c | 270 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 275 insertions(+) create mode 100644 tests/checkasm/vvc_mc.c diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile index 3b5b54352b..3562acb2b2 100644 --- a/tests/checkasm/Makefile +++ b/tests/checkasm/Makefile @@ -40,6 +40,7 @@ AVCODECOBJS-$(CONFIG_V210_DECODER) += v210dec.o AVCODECOBJS-$(CONFIG_V210_ENCODER) += v210enc.o AVCODECOBJS-$(CONFIG_VORBIS_DECODER) += vorbisdsp.o AVCODECOBJS-$(CONFIG_VP9_DECODER) += vp9dsp.o +AVCODECOBJS-$(CONFIG_VVC_DECODER) += vvc_mc.o CHECKASMOBJS-$(CONFIG_AVCODEC) += $(AVCODECOBJS-yes) diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index 87f24c77ca..36a97957e5 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -194,6 +194,9 @@ static const struct { #if CONFIG_VORBIS_DECODER { "vorbisdsp", checkasm_check_vorbisdsp }, #endif + #if CONFIG_VVC_DECODER + { "vvc_mc", checkasm_check_vvc_mc }, + #endif #endif #if CONFIG_AVFILTER #if CONFIG_AFIR_FILTER diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index 4db8c495ea..53cb3ccfbf 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -131,6 +131,7 @@ void checkasm_check_vp8dsp(void); void checkasm_check_vp9dsp(void); void checkasm_check_videodsp(void); void checkasm_check_vorbisdsp(void); +void checkasm_check_vvc_mc(void); struct CheckasmPerf; diff --git a/tests/checkasm/vvc_mc.c b/tests/checkasm/vvc_mc.c new file mode 100644 index 0000000000..711280deec --- /dev/null +++ b/tests/checkasm/vvc_mc.c @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2023-2024 Nuo Mi + * Copyright (c) 2023-2024 Wu Jianhua + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with FFmpeg; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "checkasm.h" +#include "libavcodec/avcodec.h" +#include "libavcodec/vvc/vvc_ctu.h" +#include "libavcodec/vvc/vvc_data.h" + +#include "libavutil/common.h" +#include "libavutil/internal.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/mem_internal.h" + +static const uint32_t pixel_mask[] = { 0xffffffff, 0x03ff03ff, 0x0fff0fff, 0x3fff3fff, 0xffffffff }; +static const int sizes[] = { 2, 4, 8, 16, 32, 64, 128 }; + +#define PIXEL_STRIDE (MAX_CTU_SIZE * 2) +#define EXTRA_BEFORE 3 +#define EXTRA_AFTER 4 +#define SRC_EXTRA (EXTRA_BEFORE + EXTRA_AFTER) * 2 +#define SRC_BUF_SIZE (PIXEL_STRIDE + SRC_EXTRA) * (PIXEL_STRIDE + SRC_EXTRA) +#define DST_BUF_SIZE (MAX_CTU_SIZE * MAX_CTU_SIZE * 2) +#define SRC_OFFSET ((PIXEL_STRIDE + EXTRA_BEFORE * 2) * EXTRA_BEFORE) + +#define randomize_buffers(buf0, buf1, size, mask) \ + do { \ + int k; \ + for (k = 0; k < size; k += 4) { \ + uint32_t r = rnd() & mask; \ + AV_WN32A(buf0 + k, r); \ + AV_WN32A(buf1 + k, r); \ + } \ + } while (0) + +#define randomize_pixels(buf0, buf1, size) \ + do { \ + uint32_t mask = pixel_mask[(bit_depth - 8) >> 1]; \ + randomize_buffers(buf0, buf1, size, mask); \ + } while (0) + +#define randomize_avg_src(buf0, buf1, size) \ + do { \ + uint32_t mask = 0x3fff3fff; \ + randomize_buffers(buf0, buf1, size, mask); \ + } while (0) + +static void check_put_vvc_luma(void) +{ + LOCAL_ALIGNED_32(int16_t, dst0, [DST_BUF_SIZE / 2]); + LOCAL_ALIGNED_32(int16_t, dst1, [DST_BUF_SIZE / 2]); + LOCAL_ALIGNED_32(uint8_t, src0, [SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src1, [SRC_BUF_SIZE]); + VVCDSPContext c; + + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, int16_t *dst, const uint8_t *src, const ptrdiff_t src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width); + + for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { + randomize_pixels(src0, src1, SRC_BUF_SIZE); + ff_vvc_dsp_init(&c, bit_depth); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int h = 4; h <= MAX_CTU_SIZE; h *= 2) { + for (int w = 4; w <= MAX_CTU_SIZE; w *= 2) { + const int idx = av_log2(w) - 1; + const int mx = rnd() % 16; + const int my = rnd() % 16; + const int8_t *hf = ff_vvc_inter_luma_filters[rnd() % 3][mx]; + const int8_t *vf = ff_vvc_inter_luma_filters[rnd() % 3][my]; + const char *type; + switch ((j << 1) | i) { + case 0: type = "put_luma_pixels"; break; // 0 0 + case 1: type = "put_luma_h"; break; // 0 1 + case 2: type = "put_luma_v"; break; // 1 0 + case 3: type = "put_luma_hv"; break; // 1 1 + } + if (check_func(c.inter.put[LUMA][idx][j][i], "%s_%d_%dx%d", type, bit_depth, w, h)) { + memset(dst0, 0, DST_BUF_SIZE); + memset(dst1, 0, DST_BUF_SIZE); + call_ref(dst0, src0 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + call_new(dst1, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst1, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + } + } + } + } + } + } + report("put_luma"); +} + +static void check_put_vvc_luma_uni(void) +{ + LOCAL_ALIGNED_32(uint8_t, dst0, [DST_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, dst1, [DST_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src0, [SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src1, [SRC_BUF_SIZE]); + + VVCDSPContext c; + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t dststride, + uint8_t *src, ptrdiff_t srcstride, int height, const int8_t *hf, const int8_t *vf, int width); + + for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { + ff_vvc_dsp_init(&c, bit_depth); + randomize_pixels(src0, src1, SRC_BUF_SIZE); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int h = 4; h <= MAX_CTU_SIZE; h *= 2) { + for (int w = 4; w <= MAX_CTU_SIZE; w *= 2) { + const int idx = av_log2(w) - 1; + const int mx = rnd() % VVC_INTER_LUMA_FACTS; + const int my = rnd() % VVC_INTER_LUMA_FACTS; + const int8_t *hf = ff_vvc_inter_luma_filters[rnd() % VVC_INTER_FILTER_TYPES][mx]; + const int8_t *vf = ff_vvc_inter_luma_filters[rnd() % VVC_INTER_FILTER_TYPES][my]; + const char *type; + + switch ((j << 1) | i) { + case 0: type = "put_uni_pixels"; break; // 0 0 + case 1: type = "put_uni_h"; break; // 0 1 + case 2: type = "put_uni_v"; break; // 1 0 + case 3: type = "put_uni_hv"; break; // 1 1 + } + + if (check_func(c.inter.put_uni[LUMA][idx][j][i], "%s_luma_%d_%dx%d", type, bit_depth, w, h)) { + memset(dst0, 0, DST_BUF_SIZE); + memset(dst1, 0, DST_BUF_SIZE); + call_ref(dst0, PIXEL_STRIDE, src0 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + call_new(dst1, PIXEL_STRIDE, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst1, PIXEL_STRIDE, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + } + } + } + } + } + } + report("put_uni_luma"); +} + +static void check_put_vvc_chroma(void) +{ + LOCAL_ALIGNED_32(int16_t, dst0, [DST_BUF_SIZE / 2]); + LOCAL_ALIGNED_32(int16_t, dst1, [DST_BUF_SIZE / 2]); + LOCAL_ALIGNED_32(uint8_t, src0, [SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src1, [SRC_BUF_SIZE]); + VVCDSPContext c; + + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, int16_t *dst, const uint8_t *src, const ptrdiff_t src_stride, + const int height, const int8_t *hf, const int8_t *vf, const int width); + + for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { + randomize_pixels(src0, src1, SRC_BUF_SIZE); + ff_vvc_dsp_init(&c, bit_depth); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int h = 2; h <= MAX_CTU_SIZE; h *= 2) { + for (int w = 2; w <= MAX_CTU_SIZE; w *= 2) { + const int idx = av_log2(w) - 1; + const int mx = rnd() % VVC_INTER_CHROMA_FACTS; + const int my = rnd() % VVC_INTER_CHROMA_FACTS; + const int8_t *hf = ff_vvc_inter_chroma_filters[rnd() % VVC_INTER_FILTER_TYPES][mx]; + const int8_t *vf = ff_vvc_inter_chroma_filters[rnd() % VVC_INTER_FILTER_TYPES][my]; + const char *type; + switch ((j << 1) | i) { + case 0: type = "put_chroma_pixels"; break; // 0 0 + case 1: type = "put_chroma_h"; break; // 0 1 + case 2: type = "put_chroma_v"; break; // 1 0 + case 3: type = "put_chroma_hv"; break; // 1 1 + } + if (check_func(c.inter.put[CHROMA][idx][j][i], "%s_%d_%dx%d", type, bit_depth, w, h)) { + memset(dst0, 0, DST_BUF_SIZE); + memset(dst1, 0, DST_BUF_SIZE); + call_ref(dst0, src0 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + call_new(dst1, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst1, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + } + } + } + } + } + } + report("put_chroma"); +} + +static void check_put_vvc_chroma_uni(void) +{ + LOCAL_ALIGNED_32(uint8_t, dst0, [DST_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, dst1, [DST_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src0, [SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, src1, [SRC_BUF_SIZE]); + + VVCDSPContext c; + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t dststride, + uint8_t *src, ptrdiff_t srcstride, int height, const int8_t *hf, const int8_t *vf, int width); + + for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { + ff_vvc_dsp_init(&c, bit_depth); + randomize_pixels(src0, src1, SRC_BUF_SIZE); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int h = 4; h <= MAX_CTU_SIZE; h *= 2) { + for (int w = 4; w <= MAX_CTU_SIZE; w *= 2) { + const int idx = av_log2(w) - 1; + const int mx = rnd() % VVC_INTER_CHROMA_FACTS; + const int my = rnd() % VVC_INTER_CHROMA_FACTS; + const int8_t *hf = ff_vvc_inter_chroma_filters[rnd() % VVC_INTER_FILTER_TYPES][mx]; + const int8_t *vf = ff_vvc_inter_chroma_filters[rnd() % VVC_INTER_FILTER_TYPES][my]; + const char *type; + + switch ((j << 1) | i) { + case 0: type = "put_uni_pixels"; break; // 0 0 + case 1: type = "put_uni_h"; break; // 0 1 + case 2: type = "put_uni_v"; break; // 1 0 + case 3: type = "put_uni_hv"; break; // 1 1 + } + + if (check_func(c.inter.put_uni[CHROMA][idx][j][i], "%s_chroma_%d_%dx%d", type, bit_depth, w, h)) { + memset(dst0, 0, DST_BUF_SIZE); + memset(dst1, 0, DST_BUF_SIZE); + call_ref(dst0, PIXEL_STRIDE, src0 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + call_new(dst1, PIXEL_STRIDE, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst1, PIXEL_STRIDE, src1 + SRC_OFFSET, PIXEL_STRIDE, h, hf, vf, w); + } + } + } + } + } + } + report("put_uni_chroma"); +} + +void checkasm_check_vvc_mc(void) +{ + check_put_vvc_luma(); + check_put_vvc_luma_uni(); + check_put_vvc_chroma(); + check_put_vvc_chroma_uni(); +} From patchwork Mon Jan 22 17:46:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45723 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130598pzf; Mon, 22 Jan 2024 09:47:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IG/6NwWIIXC8bOY0POneRpp4fC7ef5JpR6QJ10wKUGapwDW6RUUMEZZpeh8F/RAiHgdOzQO X-Received: by 2002:a05:6402:340d:b0:558:b48a:b5f1 with SMTP id k13-20020a056402340d00b00558b48ab5f1mr307966edc.7.1705945679385; Mon, 22 Jan 2024 09:47:59 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o6-20020a509b06000000b005548fe688ccsi11057222edi.464.2024.01.22.09.47.58; Mon, 22 Jan 2024 09:47:59 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=bjYbEk7U; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5C2C968D0E9; Mon, 22 Jan 2024 19:47:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2017.outbound.protection.outlook.com [40.92.99.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0FDDE68D0CE for ; Mon, 22 Jan 2024 19:47:06 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=a2O1dAAvdhpPSwKl2SqTzI/TlN6ZLF96fLVXDuk3nSLKZFyNSQL5ekUNJfpkNZ+44+JKPbA1WwbsZZPapSS1j1spv5KGJUCT+6ynrJsx66OjT6WnDPwlyQYfQYepfiypQ2o4pZe9AQOjrjy68YGKYqiDCGWVzLhWCioNV3RVEO55mIsCC6u+18i0bfk4iSVP1iYGkZzrmYukxkugvom64LpwX4yxBnBdYPjK/O7Wc1xTfllBQL3kQjc+hBZhZWVghC/HDielJKO4YibqehtXexVizmOXEX6Vr2Oo5xgQmZa7adqJXasocbbeVt/HozN5BhohkAOaGCj4+pBqt5vqKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rdGJDEmdkqA7Y8ffdtZZcQ3ogJrlfrfHoMxHOuIDtz4=; b=Govr9frM20327CssArmQyCussntB/SP4Ic6m9C2QXrRGV7dOAlLwBC/bkED6L8kXqA7D8Hqig/x+MqxDee55dOOMeyU5eu2CY0T6Oz1D8LE9gT5nRxAo5cApads+034YDpk9OO0lorGNoqHhGBdfWOzcTq5j3ojz6dw5ijpVzZM8HKNe1yqKk/PYjg6Ix3324IuOIWQsZrndmMGsJh/3YN7OVSTWXVtQiGhXzYOyq8YK1sCVIzWrumWimPzGjF8itzojiChXsm/yWf+OC5gX/ZwZkfDDdCF3vw8ICRtvsJu9oPbIMUE9WrxhXrGDH7u31Clv8U3wT+FxQ0ZpIE/t3A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rdGJDEmdkqA7Y8ffdtZZcQ3ogJrlfrfHoMxHOuIDtz4=; b=bjYbEk7U3ogMWDMjoN1nWzWZUw3ulNd0uwaAW865x+JIQDiKWWHycykK0kvLYdyLYFmFMqEMjg2SHjxET6xF8+i5xnmhASoD2sCMx0nFUQGEzP/DyEL2HETWqvt6jflcIRNXZkkkqW+381/lzYmGu+ixUkwG0kMcYzUW/hKyXL8y4gj2hUQ54asOfjHA85CoY96/SCDspEtz8uESokjJExOdfmcI6RCxuNWxfAicoA67nqsxY1dDDHZs7xJGzf8S+uCS9s75mn6oHxN8vPR8nMf5HdB/rzj2FJKI9WmJJdc/V0/bIOvkKJU59YOG6JhFE4YIN6mLoshr9w6jFamZ+Q== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:50 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:50 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:27 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [XjP92ULqZHXhBy/RuLZYQCV9NYNufwlH] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-7-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: 83ff1782-2537-4f43-daa6-08dc1b721c8f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qQEz5yqDi9KBqhNlXzuDVaB1uaJ76CPWKmezBfktvknf+je7GWqoiRVHNKBYXLKsL5TaoJISoSOF8sWXt6HllOnapcvsMNBw9YUVl37sYsnwVPjoW+Tf8+OrEOQimm9ELPo8mr28j6HGXwSUOZH3nYUwclHfEvLnBPBzPZCvjcdhHW8urQat9R/dYXv4n/iG0fzoSFAIW9RiK5XvsH3MrwXgYjQ0AxzgDk7DPgZW2nVx1hJhQqnvbxd/PiRzYCxPnO+8L7zv3ptrVmD4kIOK3OiuqQx9NQDE85zmr3HJsa8G5OJN5VXHz7yQ6NKWs+pzhKSNetbL+Z90oghDYmsADd2DWxvX2Wfp+44y/d8JJw28NQSVEN4pHH1vhYCXn5H4WULkIygQZC7vU8b2RxennMEEU6LdV+hPcuFS8GZrug6sNZTeu9MaTCnrPhE8/eoE+Oq3li6aLXgDPQ7pDT2jMCwYbcz20gC8pyLarJzPLJhpHwINq5nLwe0bDD1AD4ezMZUBBKkcPtvdfOicdaeiUGkf4k3tPr03StbdKj9Vxj/nxSwcD6t6sBcJF8J10/ZFhZedRt+vi/gTBZ5h23oAKg1OQeGD2BPeNm4HC1Zb/OL0tI5VZev1s0++bTZG9x6p X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?HEh6hdRiPF4rYvymsvMy/vqO82DQ?= =?utf-8?q?pNtVmNsvR0x9tfDcaA3cWcmP7WxogGx4gyoAjm07yEsbfaDfp1w6Yn8R3p6Dr6T+G?= =?utf-8?q?zEK+bMZgZFW74gwwXaHCMQFGTS2ryadKWP6M+O0tliGVxqblfxovLCT/xExUokZ6x?= =?utf-8?q?xTfHJpQ23iQpxQG1YFnPdwAtM6UinM+pyN3xqBbHEjr6ThAFS6XgyIPFR5IlOs2EF?= =?utf-8?q?lZ5Pb9OtzNfyvGX6mIp8vztsIBDD8m4vUQA9f6YNCZUl5ggoO/Jj4EUAWJTkdEgKn?= =?utf-8?q?kV7fnzRY4U0aQl4G1BBxMsv6iCO/kcgJaeHPHbTntq8K7++9ZM7zB1Th8H8CLnDVU?= =?utf-8?q?czp9qwm4nkNLu5pWdtayxJP+Y0z7pthirJv76NIz98nSD1HuVcTDRCCO9bj6NO886?= =?utf-8?q?ViDWwjhic09XNR8KcE+g7swoarE04RaWV+WrAKV5E+130Fea4Fn/5zZaf/8JW5g5Q?= =?utf-8?q?qrBPuOzaibEODnf9ou8LDC1yuzvO58Vt/cDbQVneSZsNal9Ui8eliHSiNh+xeTuVs?= =?utf-8?q?98DowHLaO0pKzH/xnBfVdpyQZ7zC6H5HwYqE3TVT6n9mbPL4VNVhOSc+ysSbpc3NJ?= =?utf-8?q?uT6Ulx+HeIkugFU3m0FUa0G/407kUiRVOki8hstujogzMobgP4IusHk+73q9ZXbnU?= =?utf-8?q?3xbGmNEWcYH25wUEhHaZH/nivF120v7wtUokPBf0C0qamGYT43+QcHVypkCAjd5NP?= =?utf-8?q?ghxsGo1/BcqSCex49JT7U41ZSTCot9FAR9MVP1o6x47ts3ya6Wd4OKc5Km0FJmA6R?= =?utf-8?q?bcWxtjdb9lyY4y/ylRzUXxSDoSP6LQTj05drt/KiyOyoOjbYD0Lr5DlRx85waUo/C?= =?utf-8?q?vclZcV/xbn8n8qoZBcfzMUbAePfb5xG+vW94yNqFVhe/7/48o5fvma5IrAJh4Hy7E?= =?utf-8?q?nJImLfz7IDOb2+kCYigDbc222Qj7QNsPO319dQ+WLKfQvYc0HADSk9CZOmv3hsmxE?= =?utf-8?q?4l/3JDDqgOxmrxiGoK+6006pLuWu4pUHo+JBScDoNF4N+EeZvmQXZ8B6H85PJA0zZ?= =?utf-8?q?OJSO2VUzR4ybZgUYSdxpvZXAAJvjo3L8md+bAK6uqjhmPsKY+Mp+bIXlEWROp2qjD?= =?utf-8?q?7Klp8xFD3jhzSTG1a1/s54YhwbEC9pF/qLFz6DPmd2c1qpgm4/Rcx8tJ4PET9wqCs?= =?utf-8?q?Y8a4aUXVYQIA98BdEClF1P7If72WFdx8Jeywmi6lZZzwCzk4ArK2h2HrXQX18=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 83ff1782-2537-4f43-daa6-08dc1b721c8f X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:50.1361 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 7/8] avcodec/x86/vvc: add avg and avg_w AVX2 optimizations 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vNDCEd7kNNwy From: Wu Jianhua The avg/avg_w is based on dav1d. See https://code.videolan.org/videolan/dav1d/-/blob/master/src/x86/mc_avx2.asm vvc_avg_8_2x2_c: 71.6 vvc_avg_8_2x2_avx2: 26.8 vvc_avg_8_2x4_c: 140.8 vvc_avg_8_2x4_avx2: 34.6 vvc_avg_8_2x8_c: 410.3 vvc_avg_8_2x8_avx2: 41.3 vvc_avg_8_2x16_c: 769.3 vvc_avg_8_2x16_avx2: 60.3 vvc_avg_8_2x32_c: 1669.6 vvc_avg_8_2x32_avx2: 105.1 vvc_avg_8_2x64_c: 1978.3 vvc_avg_8_2x64_avx2: 425.8 vvc_avg_8_2x128_c: 6536.8 vvc_avg_8_2x128_avx2: 1315.1 vvc_avg_8_4x2_c: 155.6 vvc_avg_8_4x2_avx2: 26.1 vvc_avg_8_4x4_c: 250.3 vvc_avg_8_4x4_avx2: 31.3 vvc_avg_8_4x8_c: 831.8 vvc_avg_8_4x8_avx2: 41.3 vvc_avg_8_4x16_c: 1461.1 vvc_avg_8_4x16_avx2: 57.1 vvc_avg_8_4x32_c: 2821.6 vvc_avg_8_4x32_avx2: 105.1 vvc_avg_8_4x64_c: 3615.8 vvc_avg_8_4x64_avx2: 412.6 vvc_avg_8_4x128_c: 11962.6 vvc_avg_8_4x128_avx2: 1274.3 vvc_avg_8_8x2_c: 215.8 vvc_avg_8_8x2_avx2: 29.1 vvc_avg_8_8x4_c: 430.6 vvc_avg_8_8x4_avx2: 37.6 vvc_avg_8_8x8_c: 1463.3 vvc_avg_8_8x8_avx2: 51.8 vvc_avg_8_8x16_c: 2630.1 vvc_avg_8_8x16_avx2: 97.6 vvc_avg_8_8x32_c: 5813.8 vvc_avg_8_8x32_avx2: 196.6 vvc_avg_8_8x64_c: 6687.3 vvc_avg_8_8x64_avx2: 487.8 vvc_avg_8_8x128_c: 13178.6 vvc_avg_8_8x128_avx2: 1290.6 vvc_avg_8_16x2_c: 443.8 vvc_avg_8_16x2_avx2: 28.3 vvc_avg_8_16x4_c: 1253.3 vvc_avg_8_16x4_avx2: 32.1 vvc_avg_8_16x8_c: 2236.3 vvc_avg_8_16x8_avx2: 44.3 vvc_avg_8_16x16_c: 5127.8 vvc_avg_8_16x16_avx2: 63.3 vvc_avg_8_16x32_c: 6573.3 vvc_avg_8_16x32_avx2: 223.6 vvc_avg_8_16x64_c: 30311.8 vvc_avg_8_16x64_avx2: 437.8 vvc_avg_8_16x128_c: 25693.3 vvc_avg_8_16x128_avx2: 1266.8 vvc_avg_8_32x2_c: 954.6 vvc_avg_8_32x2_avx2: 32.1 vvc_avg_8_32x4_c: 2359.6 vvc_avg_8_32x4_avx2: 39.6 vvc_avg_8_32x8_c: 5703.6 vvc_avg_8_32x8_avx2: 57.1 vvc_avg_8_32x16_c: 9967.6 vvc_avg_8_32x16_avx2: 107.1 vvc_avg_8_32x32_c: 21327.6 vvc_avg_8_32x32_avx2: 272.6 vvc_avg_8_32x64_c: 39240.8 vvc_avg_8_32x64_avx2: 529.6 vvc_avg_8_32x128_c: 52580.8 vvc_avg_8_32x128_avx2: 1338.8 vvc_avg_8_64x2_c: 1647.3 vvc_avg_8_64x2_avx2: 38.8 vvc_avg_8_64x4_c: 5130.1 vvc_avg_8_64x4_avx2: 58.8 vvc_avg_8_64x8_c: 6529.3 vvc_avg_8_64x8_avx2: 88.3 vvc_avg_8_64x16_c: 19913.6 vvc_avg_8_64x16_avx2: 162.3 vvc_avg_8_64x32_c: 39360.8 vvc_avg_8_64x32_avx2: 295.8 vvc_avg_8_64x64_c: 49658.3 vvc_avg_8_64x64_avx2: 784.1 vvc_avg_8_64x128_c: 108513.1 vvc_avg_8_64x128_avx2: 1977.1 vvc_avg_8_128x2_c: 3226.1 vvc_avg_8_128x2_avx2: 61.1 vvc_avg_8_128x4_c: 10280.3 vvc_avg_8_128x4_avx2: 94.6 vvc_avg_8_128x8_c: 18079.3 vvc_avg_8_128x8_avx2: 155.3 vvc_avg_8_128x16_c: 45121.8 vvc_avg_8_128x16_avx2: 285.3 vvc_avg_8_128x32_c: 48651.8 vvc_avg_8_128x32_avx2: 581.6 vvc_avg_8_128x64_c: 165078.6 vvc_avg_8_128x64_avx2: 1942.8 vvc_avg_8_128x128_c: 339103.1 vvc_avg_8_128x128_avx2: 4332.6 vvc_avg_10_2x2_c: 144.3 vvc_avg_10_2x2_avx2: 26.8 vvc_avg_10_2x4_c: 142.6 vvc_avg_10_2x4_avx2: 45.3 vvc_avg_10_2x8_c: 478.1 vvc_avg_10_2x8_avx2: 38.1 vvc_avg_10_2x16_c: 518.3 vvc_avg_10_2x16_avx2: 58.1 vvc_avg_10_2x32_c: 2059.8 vvc_avg_10_2x32_avx2: 93.1 vvc_avg_10_2x64_c: 2383.8 vvc_avg_10_2x64_avx2: 714.8 vvc_avg_10_2x128_c: 4498.3 vvc_avg_10_2x128_avx2: 1466.3 vvc_avg_10_4x2_c: 228.6 vvc_avg_10_4x2_avx2: 26.8 vvc_avg_10_4x4_c: 378.3 vvc_avg_10_4x4_avx2: 30.6 vvc_avg_10_4x8_c: 866.8 vvc_avg_10_4x8_avx2: 44.6 vvc_avg_10_4x16_c: 1018.1 vvc_avg_10_4x16_avx2: 58.1 vvc_avg_10_4x32_c: 3590.8 vvc_avg_10_4x32_avx2: 128.8 vvc_avg_10_4x64_c: 4200.8 vvc_avg_10_4x64_avx2: 663.6 vvc_avg_10_4x128_c: 8450.8 vvc_avg_10_4x128_avx2: 1531.8 vvc_avg_10_8x2_c: 369.3 vvc_avg_10_8x2_avx2: 28.3 vvc_avg_10_8x4_c: 513.8 vvc_avg_10_8x4_avx2: 32.1 vvc_avg_10_8x8_c: 1720.3 vvc_avg_10_8x8_avx2: 49.1 vvc_avg_10_8x16_c: 1894.8 vvc_avg_10_8x16_avx2: 71.6 vvc_avg_10_8x32_c: 3931.3 vvc_avg_10_8x32_avx2: 148.1 vvc_avg_10_8x64_c: 7964.3 vvc_avg_10_8x64_avx2: 613.1 vvc_avg_10_8x128_c: 15540.1 vvc_avg_10_8x128_avx2: 1585.1 vvc_avg_10_16x2_c: 877.3 vvc_avg_10_16x2_avx2: 27.6 vvc_avg_10_16x4_c: 955.8 vvc_avg_10_16x4_avx2: 29.8 vvc_avg_10_16x8_c: 3419.6 vvc_avg_10_16x8_avx2: 62.6 vvc_avg_10_16x16_c: 3826.8 vvc_avg_10_16x16_avx2: 54.3 vvc_avg_10_16x32_c: 7655.3 vvc_avg_10_16x32_avx2: 86.3 vvc_avg_10_16x64_c: 30011.1 vvc_avg_10_16x64_avx2: 692.6 vvc_avg_10_16x128_c: 47894.8 vvc_avg_10_16x128_avx2: 1580.3 vvc_avg_10_32x2_c: 944.3 vvc_avg_10_32x2_avx2: 29.8 vvc_avg_10_32x4_c: 2022.6 vvc_avg_10_32x4_avx2: 35.1 vvc_avg_10_32x8_c: 6148.8 vvc_avg_10_32x8_avx2: 51.3 vvc_avg_10_32x16_c: 12601.6 vvc_avg_10_32x16_avx2: 70.8 vvc_avg_10_32x32_c: 15958.6 vvc_avg_10_32x32_avx2: 124.3 vvc_avg_10_32x64_c: 31784.6 vvc_avg_10_32x64_avx2: 757.3 vvc_avg_10_32x128_c: 63892.8 vvc_avg_10_32x128_avx2: 1711.3 vvc_avg_10_64x2_c: 1890.8 vvc_avg_10_64x2_avx2: 34.3 vvc_avg_10_64x4_c: 6267.3 vvc_avg_10_64x4_avx2: 42.6 vvc_avg_10_64x8_c: 12778.1 vvc_avg_10_64x8_avx2: 67.8 vvc_avg_10_64x16_c: 22304.3 vvc_avg_10_64x16_avx2: 116.8 vvc_avg_10_64x32_c: 30777.1 vvc_avg_10_64x32_avx2: 201.1 vvc_avg_10_64x64_c: 60169.1 vvc_avg_10_64x64_avx2: 1454.3 vvc_avg_10_64x128_c: 124392.8 vvc_avg_10_64x128_avx2: 3648.6 vvc_avg_10_128x2_c: 3650.1 vvc_avg_10_128x2_avx2: 41.1 vvc_avg_10_128x4_c: 22887.8 vvc_avg_10_128x4_avx2: 64.1 vvc_avg_10_128x8_c: 14622.6 vvc_avg_10_128x8_avx2: 111.6 vvc_avg_10_128x16_c: 62207.6 vvc_avg_10_128x16_avx2: 186.3 vvc_avg_10_128x32_c: 59761.3 vvc_avg_10_128x32_avx2: 374.6 vvc_avg_10_128x64_c: 117504.3 vvc_avg_10_128x64_avx2: 2684.6 vvc_avg_10_128x128_c: 236767.6 vvc_avg_10_128x128_avx2: 15278.1 vvc_avg_12_2x2_c: 78.6 vvc_avg_12_2x2_avx2: 26.1 vvc_avg_12_2x4_c: 254.1 vvc_avg_12_2x4_avx2: 30.6 vvc_avg_12_2x8_c: 261.8 vvc_avg_12_2x8_avx2: 39.1 vvc_avg_12_2x16_c: 527.6 vvc_avg_12_2x16_avx2: 57.3 vvc_avg_12_2x32_c: 1089.1 vvc_avg_12_2x32_avx2: 93.8 vvc_avg_12_2x64_c: 2337.6 vvc_avg_12_2x64_avx2: 707.1 vvc_avg_12_2x128_c: 4582.1 vvc_avg_12_2x128_avx2: 1414.6 vvc_avg_12_4x2_c: 129.6 vvc_avg_12_4x2_avx2: 26.8 vvc_avg_12_4x4_c: 427.3 vvc_avg_12_4x4_avx2: 30.6 vvc_avg_12_4x8_c: 529.6 vvc_avg_12_4x8_avx2: 36.6 vvc_avg_12_4x16_c: 1022.1 vvc_avg_12_4x16_avx2: 57.3 vvc_avg_12_4x32_c: 1987.6 vvc_avg_12_4x32_avx2: 84.3 vvc_avg_12_4x64_c: 4147.6 vvc_avg_12_4x64_avx2: 706.3 vvc_avg_12_4x128_c: 8469.3 vvc_avg_12_4x128_avx2: 1448.3 vvc_avg_12_8x2_c: 253.6 vvc_avg_12_8x2_avx2: 27.6 vvc_avg_12_8x4_c: 836.3 vvc_avg_12_8x4_avx2: 32.1 vvc_avg_12_8x8_c: 1074.6 vvc_avg_12_8x8_avx2: 45.1 vvc_avg_12_8x16_c: 3616.8 vvc_avg_12_8x16_avx2: 71.6 vvc_avg_12_8x32_c: 3823.6 vvc_avg_12_8x32_avx2: 140.1 vvc_avg_12_8x64_c: 7764.8 vvc_avg_12_8x64_avx2: 656.1 vvc_avg_12_8x128_c: 15896.1 vvc_avg_12_8x128_avx2: 1232.8 vvc_avg_12_16x2_c: 462.1 vvc_avg_12_16x2_avx2: 26.8 vvc_avg_12_16x4_c: 1732.1 vvc_avg_12_16x4_avx2: 29.1 vvc_avg_12_16x8_c: 2097.6 vvc_avg_12_16x8_avx2: 62.6 vvc_avg_12_16x16_c: 6753.1 vvc_avg_12_16x16_avx2: 47.8 vvc_avg_12_16x32_c: 7373.1 vvc_avg_12_16x32_avx2: 80.8 vvc_avg_12_16x64_c: 15046.3 vvc_avg_12_16x64_avx2: 621.1 vvc_avg_12_16x128_c: 52574.6 vvc_avg_12_16x128_avx2: 1417.1 vvc_avg_12_32x2_c: 1712.1 vvc_avg_12_32x2_avx2: 29.8 vvc_avg_12_32x4_c: 2036.8 vvc_avg_12_32x4_avx2: 37.6 vvc_avg_12_32x8_c: 4017.6 vvc_avg_12_32x8_avx2: 44.1 vvc_avg_12_32x16_c: 8018.6 vvc_avg_12_32x16_avx2: 70.8 vvc_avg_12_32x32_c: 15637.6 vvc_avg_12_32x32_avx2: 124.3 vvc_avg_12_32x64_c: 31143.3 vvc_avg_12_32x64_avx2: 830.3 vvc_avg_12_32x128_c: 75706.8 vvc_avg_12_32x128_avx2: 1604.8 vvc_avg_12_64x2_c: 3230.3 vvc_avg_12_64x2_avx2: 33.6 vvc_avg_12_64x4_c: 4139.6 vvc_avg_12_64x4_avx2: 45.1 vvc_avg_12_64x8_c: 8201.6 vvc_avg_12_64x8_avx2: 67.1 vvc_avg_12_64x16_c: 25632.3 vvc_avg_12_64x16_avx2: 110.3 vvc_avg_12_64x32_c: 30744.3 vvc_avg_12_64x32_avx2: 200.3 vvc_avg_12_64x64_c: 105554.8 vvc_avg_12_64x64_avx2: 1325.6 vvc_avg_12_64x128_c: 235254.3 vvc_avg_12_64x128_avx2: 3132.6 vvc_avg_12_128x2_c: 6194.3 vvc_avg_12_128x2_avx2: 55.1 vvc_avg_12_128x4_c: 7583.8 vvc_avg_12_128x4_avx2: 79.3 vvc_avg_12_128x8_c: 14635.6 vvc_avg_12_128x8_avx2: 104.3 vvc_avg_12_128x16_c: 29270.8 vvc_avg_12_128x16_avx2: 194.3 vvc_avg_12_128x32_c: 60113.6 vvc_avg_12_128x32_avx2: 346.3 vvc_avg_12_128x64_c: 197030.3 vvc_avg_12_128x64_avx2: 2779.6 vvc_avg_12_128x128_c: 432809.6 vvc_avg_12_128x128_avx2: 5513.3 vvc_w_avg_8_2x2_c: 84.3 vvc_w_avg_8_2x2_avx2: 42.6 vvc_w_avg_8_2x4_c: 156.3 vvc_w_avg_8_2x4_avx2: 58.8 vvc_w_avg_8_2x8_c: 310.6 vvc_w_avg_8_2x8_avx2: 73.1 vvc_w_avg_8_2x16_c: 942.1 vvc_w_avg_8_2x16_avx2: 113.3 vvc_w_avg_8_2x32_c: 1098.8 vvc_w_avg_8_2x32_avx2: 202.6 vvc_w_avg_8_2x64_c: 2414.3 vvc_w_avg_8_2x64_avx2: 467.6 vvc_w_avg_8_2x128_c: 4763.8 vvc_w_avg_8_2x128_avx2: 1333.1 vvc_w_avg_8_4x2_c: 140.1 vvc_w_avg_8_4x2_avx2: 49.8 vvc_w_avg_8_4x4_c: 276.3 vvc_w_avg_8_4x4_avx2: 58.1 vvc_w_avg_8_4x8_c: 524.3 vvc_w_avg_8_4x8_avx2: 72.3 vvc_w_avg_8_4x16_c: 1108.1 vvc_w_avg_8_4x16_avx2: 111.8 vvc_w_avg_8_4x32_c: 2149.8 vvc_w_avg_8_4x32_avx2: 199.6 vvc_w_avg_8_4x64_c: 12288.1 vvc_w_avg_8_4x64_avx2: 509.3 vvc_w_avg_8_4x128_c: 8398.6 vvc_w_avg_8_4x128_avx2: 1319.6 vvc_w_avg_8_8x2_c: 271.1 vvc_w_avg_8_8x2_avx2: 44.1 vvc_w_avg_8_8x4_c: 503.3 vvc_w_avg_8_8x4_avx2: 61.8 vvc_w_avg_8_8x8_c: 1031.1 vvc_w_avg_8_8x8_avx2: 93.8 vvc_w_avg_8_8x16_c: 2009.8 vvc_w_avg_8_8x16_avx2: 163.1 vvc_w_avg_8_8x32_c: 4161.3 vvc_w_avg_8_8x32_avx2: 292.1 vvc_w_avg_8_8x64_c: 7940.6 vvc_w_avg_8_8x64_avx2: 592.1 vvc_w_avg_8_8x128_c: 16802.3 vvc_w_avg_8_8x128_avx2: 1287.6 vvc_w_avg_8_16x2_c: 762.6 vvc_w_avg_8_16x2_avx2: 53.6 vvc_w_avg_8_16x4_c: 1486.3 vvc_w_avg_8_16x4_avx2: 67.1 vvc_w_avg_8_16x8_c: 1907.8 vvc_w_avg_8_16x8_avx2: 96.8 vvc_w_avg_8_16x16_c: 3883.6 vvc_w_avg_8_16x16_avx2: 151.3 vvc_w_avg_8_16x32_c: 7974.8 vvc_w_avg_8_16x32_avx2: 285.8 vvc_w_avg_8_16x64_c: 25160.6 vvc_w_avg_8_16x64_avx2: 589.8 vvc_w_avg_8_16x128_c: 58328.1 vvc_w_avg_8_16x128_avx2: 1169.8 vvc_w_avg_8_32x2_c: 1009.1 vvc_w_avg_8_32x2_avx2: 65.6 vvc_w_avg_8_32x4_c: 2091.1 vvc_w_avg_8_32x4_avx2: 96.8 vvc_w_avg_8_32x8_c: 3997.8 vvc_w_avg_8_32x8_avx2: 156.3 vvc_w_avg_8_32x16_c: 8216.8 vvc_w_avg_8_32x16_avx2: 269.6 vvc_w_avg_8_32x32_c: 21746.1 vvc_w_avg_8_32x32_avx2: 635.3 vvc_w_avg_8_32x64_c: 31564.8 vvc_w_avg_8_32x64_avx2: 1010.6 vvc_w_avg_8_32x128_c: 114373.3 vvc_w_avg_8_32x128_avx2: 2013.6 vvc_w_avg_8_64x2_c: 2067.3 vvc_w_avg_8_64x2_avx2: 97.6 vvc_w_avg_8_64x4_c: 3901.1 vvc_w_avg_8_64x4_avx2: 154.8 vvc_w_avg_8_64x8_c: 7911.6 vvc_w_avg_8_64x8_avx2: 268.8 vvc_w_avg_8_64x16_c: 16508.8 vvc_w_avg_8_64x16_avx2: 501.8 vvc_w_avg_8_64x32_c: 38770.3 vvc_w_avg_8_64x32_avx2: 1287.6 vvc_w_avg_8_64x64_c: 110350.6 vvc_w_avg_8_64x64_avx2: 1890.8 vvc_w_avg_8_64x128_c: 141354.6 vvc_w_avg_8_64x128_avx2: 3839.6 vvc_w_avg_8_128x2_c: 7012.1 vvc_w_avg_8_128x2_avx2: 159.3 vvc_w_avg_8_128x4_c: 8146.8 vvc_w_avg_8_128x4_avx2: 272.6 vvc_w_avg_8_128x8_c: 24596.8 vvc_w_avg_8_128x8_avx2: 501.1 vvc_w_avg_8_128x16_c: 35918.1 vvc_w_avg_8_128x16_avx2: 948.8 vvc_w_avg_8_128x32_c: 68799.6 vvc_w_avg_8_128x32_avx2: 1963.1 vvc_w_avg_8_128x64_c: 133862.1 vvc_w_avg_8_128x64_avx2: 3833.6 vvc_w_avg_8_128x128_c: 348427.8 vvc_w_avg_8_128x128_avx2: 7682.8 vvc_w_avg_10_2x2_c: 118.6 vvc_w_avg_10_2x2_avx2: 73.1 vvc_w_avg_10_2x4_c: 189.1 vvc_w_avg_10_2x4_avx2: 89.3 vvc_w_avg_10_2x8_c: 382.8 vvc_w_avg_10_2x8_avx2: 179.8 vvc_w_avg_10_2x16_c: 658.3 vvc_w_avg_10_2x16_avx2: 185.1 vvc_w_avg_10_2x32_c: 1409.3 vvc_w_avg_10_2x32_avx2: 290.8 vvc_w_avg_10_2x64_c: 2906.8 vvc_w_avg_10_2x64_avx2: 793.1 vvc_w_avg_10_2x128_c: 6292.6 vvc_w_avg_10_2x128_avx2: 1696.8 vvc_w_avg_10_4x2_c: 178.8 vvc_w_avg_10_4x2_avx2: 80.1 vvc_w_avg_10_4x4_c: 581.6 vvc_w_avg_10_4x4_avx2: 97.6 vvc_w_avg_10_4x8_c: 693.3 vvc_w_avg_10_4x8_avx2: 128.1 vvc_w_avg_10_4x16_c: 1436.6 vvc_w_avg_10_4x16_avx2: 179.8 vvc_w_avg_10_4x32_c: 2409.1 vvc_w_avg_10_4x32_avx2: 292.3 vvc_w_avg_10_4x64_c: 4925.3 vvc_w_avg_10_4x64_avx2: 746.1 vvc_w_avg_10_4x128_c: 10664.6 vvc_w_avg_10_4x128_avx2: 1647.6 vvc_w_avg_10_8x2_c: 359.3 vvc_w_avg_10_8x2_avx2: 80.1 vvc_w_avg_10_8x4_c: 925.6 vvc_w_avg_10_8x4_avx2: 97.6 vvc_w_avg_10_8x8_c: 1360.6 vvc_w_avg_10_8x8_avx2: 121.8 vvc_w_avg_10_8x16_c: 3490.3 vvc_w_avg_10_8x16_avx2: 203.3 vvc_w_avg_10_8x32_c: 5266.1 vvc_w_avg_10_8x32_avx2: 325.8 vvc_w_avg_10_8x64_c: 11127.1 vvc_w_avg_10_8x64_avx2: 747.8 vvc_w_avg_10_8x128_c: 31058.3 vvc_w_avg_10_8x128_avx2: 1424.6 vvc_w_avg_10_16x2_c: 624.8 vvc_w_avg_10_16x2_avx2: 84.6 vvc_w_avg_10_16x4_c: 1389.6 vvc_w_avg_10_16x4_avx2: 109.1 vvc_w_avg_10_16x8_c: 2688.3 vvc_w_avg_10_16x8_avx2: 137.1 vvc_w_avg_10_16x16_c: 5387.1 vvc_w_avg_10_16x16_avx2: 224.6 vvc_w_avg_10_16x32_c: 10776.3 vvc_w_avg_10_16x32_avx2: 312.1 vvc_w_avg_10_16x64_c: 18069.1 vvc_w_avg_10_16x64_avx2: 858.6 vvc_w_avg_10_16x128_c: 43460.3 vvc_w_avg_10_16x128_avx2: 1411.6 vvc_w_avg_10_32x2_c: 1232.8 vvc_w_avg_10_32x2_avx2: 99.1 vvc_w_avg_10_32x4_c: 4017.6 vvc_w_avg_10_32x4_avx2: 134.1 vvc_w_avg_10_32x8_c: 9306.3 vvc_w_avg_10_32x8_avx2: 208.1 vvc_w_avg_10_32x16_c: 8424.6 vvc_w_avg_10_32x16_avx2: 349.3 vvc_w_avg_10_32x32_c: 20787.8 vvc_w_avg_10_32x32_avx2: 655.3 vvc_w_avg_10_32x64_c: 40972.1 vvc_w_avg_10_32x64_avx2: 904.8 vvc_w_avg_10_32x128_c: 85670.3 vvc_w_avg_10_32x128_avx2: 1751.6 vvc_w_avg_10_64x2_c: 2454.1 vvc_w_avg_10_64x2_avx2: 132.6 vvc_w_avg_10_64x4_c: 5012.6 vvc_w_avg_10_64x4_avx2: 215.6 vvc_w_avg_10_64x8_c: 10811.3 vvc_w_avg_10_64x8_avx2: 361.1 vvc_w_avg_10_64x16_c: 33349.1 vvc_w_avg_10_64x16_avx2: 904.1 vvc_w_avg_10_64x32_c: 41892.3 vvc_w_avg_10_64x32_avx2: 1220.6 vvc_w_avg_10_64x64_c: 66983.3 vvc_w_avg_10_64x64_avx2: 2622.1 vvc_w_avg_10_64x128_c: 246508.8 vvc_w_avg_10_64x128_avx2: 3316.8 vvc_w_avg_10_128x2_c: 7791.6 vvc_w_avg_10_128x2_avx2: 198.8 vvc_w_avg_10_128x4_c: 10534.3 vvc_w_avg_10_128x4_avx2: 337.3 vvc_w_avg_10_128x8_c: 21142.3 vvc_w_avg_10_128x8_avx2: 614.8 vvc_w_avg_10_128x16_c: 40968.6 vvc_w_avg_10_128x16_avx2: 1160.6 vvc_w_avg_10_128x32_c: 113043.3 vvc_w_avg_10_128x32_avx2: 1644.6 vvc_w_avg_10_128x64_c: 230658.3 vvc_w_avg_10_128x64_avx2: 5065.3 vvc_w_avg_10_128x128_c: 335236.3 vvc_w_avg_10_128x128_avx2: 6450.3 vvc_w_avg_12_2x2_c: 185.3 vvc_w_avg_12_2x2_avx2: 43.6 vvc_w_avg_12_2x4_c: 340.3 vvc_w_avg_12_2x4_avx2: 55.8 vvc_w_avg_12_2x8_c: 632.3 vvc_w_avg_12_2x8_avx2: 70.1 vvc_w_avg_12_2x16_c: 728.3 vvc_w_avg_12_2x16_avx2: 108.1 vvc_w_avg_12_2x32_c: 1392.6 vvc_w_avg_12_2x32_avx2: 176.8 vvc_w_avg_12_2x64_c: 2618.3 vvc_w_avg_12_2x64_avx2: 757.3 vvc_w_avg_12_2x128_c: 6408.8 vvc_w_avg_12_2x128_avx2: 1435.1 vvc_w_avg_12_4x2_c: 349.3 vvc_w_avg_12_4x2_avx2: 44.3 vvc_w_avg_12_4x4_c: 607.1 vvc_w_avg_12_4x4_avx2: 52.6 vvc_w_avg_12_4x8_c: 1134.8 vvc_w_avg_12_4x8_avx2: 70.1 vvc_w_avg_12_4x16_c: 1378.1 vvc_w_avg_12_4x16_avx2: 115.3 vvc_w_avg_12_4x32_c: 2599.3 vvc_w_avg_12_4x32_avx2: 174.3 vvc_w_avg_12_4x64_c: 4474.8 vvc_w_avg_12_4x64_avx2: 656.1 vvc_w_avg_12_4x128_c: 11319.6 vvc_w_avg_12_4x128_avx2: 1373.1 vvc_w_avg_12_8x2_c: 595.8 vvc_w_avg_12_8x2_avx2: 44.3 vvc_w_avg_12_8x4_c: 1164.3 vvc_w_avg_12_8x4_avx2: 56.6 vvc_w_avg_12_8x8_c: 2019.6 vvc_w_avg_12_8x8_avx2: 80.1 vvc_w_avg_12_8x16_c: 4071.6 vvc_w_avg_12_8x16_avx2: 139.3 vvc_w_avg_12_8x32_c: 4485.1 vvc_w_avg_12_8x32_avx2: 250.6 vvc_w_avg_12_8x64_c: 8404.8 vvc_w_avg_12_8x64_avx2: 735.8 vvc_w_avg_12_8x128_c: 35679.8 vvc_w_avg_12_8x128_avx2: 1252.6 vvc_w_avg_12_16x2_c: 1114.8 vvc_w_avg_12_16x2_avx2: 46.6 vvc_w_avg_12_16x4_c: 2240.1 vvc_w_avg_12_16x4_avx2: 62.6 vvc_w_avg_12_16x8_c: 13174.6 vvc_w_avg_12_16x8_avx2: 88.6 vvc_w_avg_12_16x16_c: 5334.6 vvc_w_avg_12_16x16_avx2: 144.3 vvc_w_avg_12_16x32_c: 8378.1 vvc_w_avg_12_16x32_avx2: 234.6 vvc_w_avg_12_16x64_c: 21300.8 vvc_w_avg_12_16x64_avx2: 761.8 vvc_w_avg_12_16x128_c: 32786.8 vvc_w_avg_12_16x128_avx2: 1432.8 vvc_w_avg_12_32x2_c: 2154.3 vvc_w_avg_12_32x2_avx2: 61.1 vvc_w_avg_12_32x4_c: 4299.8 vvc_w_avg_12_32x4_avx2: 83.1 vvc_w_avg_12_32x8_c: 7964.8 vvc_w_avg_12_32x8_avx2: 132.6 vvc_w_avg_12_32x16_c: 13321.6 vvc_w_avg_12_32x16_avx2: 234.6 vvc_w_avg_12_32x32_c: 21149.3 vvc_w_avg_12_32x32_avx2: 433.3 vvc_w_avg_12_32x64_c: 43666.6 vvc_w_avg_12_32x64_avx2: 876.6 vvc_w_avg_12_32x128_c: 83189.8 vvc_w_avg_12_32x128_avx2: 1756.6 vvc_w_avg_12_64x2_c: 3829.8 vvc_w_avg_12_64x2_avx2: 83.1 vvc_w_avg_12_64x4_c: 8588.1 vvc_w_avg_12_64x4_avx2: 127.1 vvc_w_avg_12_64x8_c: 17027.6 vvc_w_avg_12_64x8_avx2: 310.6 vvc_w_avg_12_64x16_c: 29797.8 vvc_w_avg_12_64x16_avx2: 415.6 vvc_w_avg_12_64x32_c: 43854.3 vvc_w_avg_12_64x32_avx2: 773.3 vvc_w_avg_12_64x64_c: 137767.3 vvc_w_avg_12_64x64_avx2: 1608.6 vvc_w_avg_12_64x128_c: 316428.3 vvc_w_avg_12_64x128_avx2: 3249.8 vvc_w_avg_12_128x2_c: 8824.6 vvc_w_avg_12_128x2_avx2: 130.3 vvc_w_avg_12_128x4_c: 17173.6 vvc_w_avg_12_128x4_avx2: 219.3 vvc_w_avg_12_128x8_c: 21997.8 vvc_w_avg_12_128x8_avx2: 397.3 vvc_w_avg_12_128x16_c: 43553.8 vvc_w_avg_12_128x16_avx2: 790.1 vvc_w_avg_12_128x32_c: 89792.1 vvc_w_avg_12_128x32_avx2: 1497.6 vvc_w_avg_12_128x64_c: 226573.3 vvc_w_avg_12_128x64_avx2: 3153.1 vvc_w_avg_12_128x128_c: 332090.1 vvc_w_avg_12_128x128_avx2: 6499.6 Signed-off-by: Wu Jianhua --- libavcodec/x86/vvc/Makefile | 3 +- libavcodec/x86/vvc/vvc_mc.asm | 301 +++++++++++++++++++++++++++++++ libavcodec/x86/vvc/vvcdsp_init.c | 52 ++++++ 3 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 libavcodec/x86/vvc/vvc_mc.asm diff --git a/libavcodec/x86/vvc/Makefile b/libavcodec/x86/vvc/Makefile index b4acc22501..29765a6c48 100644 --- a/libavcodec/x86/vvc/Makefile +++ b/libavcodec/x86/vvc/Makefile @@ -2,5 +2,6 @@ clean:: $(RM) $(CLEANSUFFIXES:%=libavcodec/x86/vvc/%) OBJS-$(CONFIG_VVC_DECODER) += x86/vvc/vvcdsp_init.o -X86ASM-OBJS-$(CONFIG_VVC_DECODER) += x86/h26x/h2656dsp.o \ +X86ASM-OBJS-$(CONFIG_VVC_DECODER) += x86/vvc/vvc_mc.o \ + x86/h26x/h2656dsp.o \ x86/h26x/h2656_inter.o diff --git a/libavcodec/x86/vvc/vvc_mc.asm b/libavcodec/x86/vvc/vvc_mc.asm new file mode 100644 index 0000000000..d0a34d3952 --- /dev/null +++ b/libavcodec/x86/vvc/vvc_mc.asm @@ -0,0 +1,301 @@ +; /* +; * Provide SIMD MC functions for VVC decoding +; * +; * Copyright © 2021, VideoLAN and dav1d authors +; * Copyright © 2021, Two Orioles, LLC +; * All rights reserved. +; * +; * Copyright (c) 2023-2024 Nuo Mi +; * Copyright (c) 2023-2024 Wu Jianhua +; * +; * This file is part of FFmpeg. +; * +; * FFmpeg is free software; you can redistribute it and/or +; * modify it under the terms of the GNU Lesser General Public +; * License as published by the Free Software Foundation; either +; * version 2.1 of the License, or (at your option) any later version. +; * +; * FFmpeg is distributed in the hope that it will be useful, +; * but WITHOUT ANY WARRANTY; without even the implied warranty of +; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; * Lesser General Public License for more details. +; * +; * You should have received a copy of the GNU Lesser General Public +; * License along with FFmpeg; if not, write to the Free Software +; * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +; */ + +%include "libavutil/x86/x86util.asm" + +%define MAX_PB_SIZE 128 + +SECTION_RODATA 32 + +pw_0 times 2 dw 0 +pw_1 times 2 dw 1 +pw_4 times 2 dw 4 +pw_12 times 2 dw 12 +pw_256 times 2 dw 256 + +%macro AVG_JMP_TABLE 3-* + %xdefine %1_%2_%3_table (%%table - 2*%4) + %xdefine %%base %1_%2_%3_table + %xdefine %%prefix mangle(private_prefix %+ _vvc_%1_%2bpc_%3) + %%table: + %rep %0 - 3 + dd %%prefix %+ .w%4 - %%base + %rotate 1 + %endrep +%endmacro + +AVG_JMP_TABLE avg, 8, avx2, 2, 4, 8, 16, 32, 64, 128 +AVG_JMP_TABLE avg, 16, avx2, 2, 4, 8, 16, 32, 64, 128 +AVG_JMP_TABLE w_avg, 8, avx2, 2, 4, 8, 16, 32, 64, 128 +AVG_JMP_TABLE w_avg, 16, avx2, 2, 4, 8, 16, 32, 64, 128 + +SECTION .text + +%macro AVG_W16_FN 3 ; bpc, op, count + %assign %%i 0 + %rep %3 + %define off %%i + AVG_LOAD_W16 0, off + %2 + AVG_SAVE_W16 %1, 0, off + + + AVG_LOAD_W16 1, off + %2 + AVG_SAVE_W16 %1, 1, off + + %assign %%i %%i+1 + %endrep +%endmacro + +%macro AVG_FN 2 ; bpc, op + jmp wq + +.w2: + movd xm0, [src0q] + pinsrd xm0, [src0q + AVG_SRC_STRIDE], 1 + movd xm1, [src1q] + pinsrd xm1, [src1q + AVG_SRC_STRIDE], 1 + %2 + AVG_SAVE_W2 %1 + AVG_LOOP_END .w2 + +.w4: + movq xm0, [src0q] + pinsrq xm0, [src0q + AVG_SRC_STRIDE], 1 + movq xm1, [src1q] + pinsrq xm1, [src1q + AVG_SRC_STRIDE], 1 + %2 + AVG_SAVE_W4 %1 + + AVG_LOOP_END .w4 + +.w8: + vinserti128 m0, m0, [src0q], 0 + vinserti128 m0, m0, [src0q + AVG_SRC_STRIDE], 1 + vinserti128 m1, m1, [src1q], 0 + vinserti128 m1, m1, [src1q + AVG_SRC_STRIDE], 1 + %2 + AVG_SAVE_W8 %1 + + AVG_LOOP_END .w8 + +.w16: + AVG_W16_FN %1, %2, 1 + + AVG_LOOP_END .w16 + +.w32: + AVG_W16_FN %1, %2, 2 + + AVG_LOOP_END .w32 + +.w64: + AVG_W16_FN %1, %2, 4 + + AVG_LOOP_END .w64 + +.w128: + AVG_W16_FN %1, %2, 8 + + AVG_LOOP_END .w128 + +.ret: + RET +%endmacro + +%macro AVG 0 + paddsw m0, m1 + pmulhrsw m0, m2 + CLIPW m0, m3, m4 +%endmacro + +%macro W_AVG 0 + punpckhwd m5, m0, m1 + pmaddwd m5, m3 + paddd m5, m4 + psrad m5, xm2 + + punpcklwd m0, m0, m1 + pmaddwd m0, m3 + paddd m0, m4 + psrad m0, xm2 + + packssdw m0, m5 + CLIPW m0, m6, m7 +%endmacro + +%macro AVG_LOAD_W16 2 ; line, offset + movu m0, [src0q + %1 * AVG_SRC_STRIDE + %2 * 32] + movu m1, [src1q + %1 * AVG_SRC_STRIDE + %2 * 32] +%endmacro + +%macro AVG_SAVE_W2 1 ;bpc + %if %1 == 16 + pextrd [dstq], xm0, 0 + pextrd [dstq + strideq], xm0, 1 + %else + packuswb m0, m0 + pextrw [dstq], xm0, 0 + pextrw [dstq + strideq], xm0, 1 + %endif +%endmacro + +%macro AVG_SAVE_W4 1 ;bpc + %if %1 == 16 + pextrq [dstq], xm0, 0 + pextrq [dstq + strideq], xm0, 1 + %else + packuswb m0, m0 + pextrd [dstq], xm0, 0 + pextrd [dstq + strideq], xm0, 1 + %endif +%endmacro + +%macro AVG_SAVE_W8 1 ;bpc + %if %1 == 16 + vextracti128 [dstq], m0, 0 + vextracti128 [dstq + strideq], m0, 1 + %else + packuswb m0, m0 + vpermq m0, m0, 1000b + pextrq [dstq], xm0, 0 + pextrq [dstq + strideq], xm0, 1 + %endif +%endmacro + +%macro AVG_SAVE_W16 3 ; bpc, line, offset + %if %1 == 16 + movu [dstq + %2 * strideq + %3 * 32], m0 + %else + packuswb m0, m0 + vpermq m0, m0, 1000b + vextracti128 [dstq + %2 * strideq + %3 * 16], m0, 0 + %endif +%endmacro + +%macro AVG_LOOP_END 1 + sub hd, 2 + je .ret + + lea src0q, [src0q + 2 * AVG_SRC_STRIDE] + lea src1q, [src1q + 2 * AVG_SRC_STRIDE] + lea dstq, [dstq + 2 * strideq] + jmp %1 +%endmacro + +%define AVG_SRC_STRIDE MAX_PB_SIZE*2 + +;void ff_vvc_avg_%1bpc_avx2(uint8_t *dst, ptrdiff_t dst_stride, +; const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, intptr_t pixel_max); +%macro VVC_AVG_AVX2 1 +cglobal vvc_avg_%1bpc, 4, 7, 5, dst, stride, src0, src1, w, h, bd + movifnidn hd, hm + + pxor m3, m3 ; pixel min + vpbroadcastw m4, bdm ; pixel max + + movifnidn bdd, bdm + inc bdd + tzcnt bdd, bdd ; bit depth + + sub bdd, 8 + movd xm0, bdd + vpbroadcastd m1, [pw_4] + pminuw m0, m1 + vpbroadcastd m2, [pw_256] + psllw m2, xm0 ; shift + + lea r6, [avg_%1 %+ SUFFIX %+ _table] + tzcnt wd, wm + movsxd wq, dword [r6+wq*4] + add wq, r6 + AVG_FN %1, AVG +%endmacro + +;void ff_vvc_w_avg_%1bpc_avx(uint8_t *dst, ptrdiff_t dst_stride, +; const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, +; intptr_t denom, intptr_t w0, intptr_t w1, intptr_t o0, intptr_t o1, intptr_t pixel_max); +%macro VVC_W_AVG_AVX2 1 +cglobal vvc_w_avg_%1bpc, 4, 7, 8, dst, stride, src0, src1, w, h, t0, t1 + + movifnidn hd, hm + + movifnidn t0d, r8m ; w1 + shl t0d, 16 + mov t0w, r7m ; w0 + movd xm3, t0d + vpbroadcastd m3, xm3 ; w0, w1 + + pxor m6, m6 ;pixel min + vpbroadcastw m7, r11m ;pixel max + + mov t1q, rcx ; save ecx + mov ecx, r11m + inc ecx ; bd + tzcnt ecx, ecx + sub ecx, 8 + mov t0d, r9m ; o0 + add t0d, r10m ; o1 + shl t0d, cl + inc t0d ;((o0 + o1) << (BIT_DEPTH - 8)) + 1 + + neg ecx + add ecx, 4 ; bd - 12 + cmovl ecx, [pw_0] + add ecx, 3 + add ecx, r6m + movd xm2, ecx ; shift + + dec ecx + shl t0d, cl + movd xm4, t0d + vpbroadcastd m4, xm4 ; offset + mov rcx, t1q ; restore ecx + + lea r6, [w_avg_%1 %+ SUFFIX %+ _table] + tzcnt wd, wm + movsxd wq, dword [r6+wq*4] + add wq, r6 + AVG_FN %1, W_AVG +%endmacro + +%if ARCH_X86_64 + +%if HAVE_AVX2_EXTERNAL +INIT_YMM avx2 + +VVC_AVG_AVX2 16 + +VVC_AVG_AVX2 8 + +VVC_W_AVG_AVX2 16 + +VVC_W_AVG_AVX2 8 +%endif + +%endif diff --git a/libavcodec/x86/vvc/vvcdsp_init.c b/libavcodec/x86/vvc/vvcdsp_init.c index c197cdb4cc..909ef9f56b 100644 --- a/libavcodec/x86/vvc/vvcdsp_init.c +++ b/libavcodec/x86/vvc/vvcdsp_init.c @@ -169,6 +169,42 @@ FW_PUT_16BPC_AVX2(12); MC_TAP_LINKS_16BPC_AVX2(LUMA, 8, bd); \ MC_TAP_LINKS_16BPC_AVX2(CHROMA, 4, bd); +#define bf(fn, bd, opt) fn##_##bd##_##opt +#define BF(fn, bpc, opt) fn##_##bpc##bpc_##opt + +#define AVG_BPC_FUNC(bpc, opt) \ +void BF(ff_vvc_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride, \ + const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, intptr_t pixel_max); \ +void BF(ff_vvc_w_avg, bpc, opt)(uint8_t *dst, ptrdiff_t dst_stride, \ + const int16_t *src0, const int16_t *src1, intptr_t width, intptr_t height, \ + intptr_t denom, intptr_t w0, intptr_t w1, intptr_t o0, intptr_t o1, intptr_t pixel_max); + +#define AVG_FUNCS(bpc, bd, opt) \ +static void bf(avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride, \ + const int16_t *src0, const int16_t *src1, int width, int height) \ +{ \ + BF(ff_vvc_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height, (1 << bd) - 1); \ +} \ +static void bf(w_avg, bd, opt)(uint8_t *dst, ptrdiff_t dst_stride, \ + const int16_t *src0, const int16_t *src1, int width, int height, \ + int denom, int w0, int w1, int o0, int o1) \ +{ \ + BF(ff_vvc_w_avg, bpc, opt)(dst, dst_stride, src0, src1, width, height, \ + denom, w0, w1, o0, o1, (1 << bd) - 1); \ +} + +AVG_BPC_FUNC(8, avx2) +AVG_BPC_FUNC(16, avx2) + +AVG_FUNCS(8, 8, avx2) +AVG_FUNCS(16, 10, avx2) +AVG_FUNCS(16, 12, avx2) + +#define AVG_INIT(bd, opt) do { \ + c->inter.avg = bf(avg, bd, opt); \ + c->inter.w_avg = bf(w_avg, bd, opt); \ +} while (0) + void ff_vvc_dsp_init_x86(VVCDSPContext *const c, const int bd) { const int cpu_flags = av_get_cpu_flags(); @@ -198,5 +234,21 @@ void ff_vvc_dsp_init_x86(VVCDSPContext *const c, const int bd) MC_LINKS_16BPC_AVX2(12); } } + + if (EXTERNAL_AVX2(cpu_flags)) { + switch (bd) { + case 8: + AVG_INIT(8, avx2); + break; + case 10: + AVG_INIT(10, avx2); + break; + case 12: + AVG_INIT(12, avx2); + break; + default: + break; + } + } } } From patchwork Mon Jan 22 17:46:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wu Jianhua X-Patchwork-Id: 45724 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:120f:b0:199:de12:6fa6 with SMTP id v15csp130681pzf; Mon, 22 Jan 2024 09:48:08 -0800 (PST) X-Google-Smtp-Source: AGHT+IESR2/ze3Vrg7PE5p5y1MpQqLsfRRjsrd/9kaUo7UXWT+7kgUjPvRuGZMDJrFxtE/fQItK/ X-Received: by 2002:a05:6402:51d3:b0:55c:7350:98a7 with SMTP id r19-20020a05640251d300b0055c735098a7mr91319edd.27.1705945688443; Mon, 22 Jan 2024 09:48:08 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f16-20020a0564021e9000b0055c6562b2c3si425279edf.382.2024.01.22.09.48.08; Mon, 22 Jan 2024 09:48:08 -0800 (PST) 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=@outlook.com header.s=selector1 header.b=V+Li8AxD; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8576868D0F9; Mon, 22 Jan 2024 19:47:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01olkn2066.outbound.protection.outlook.com [40.92.99.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4B0BF68D089 for ; Mon, 22 Jan 2024 19:47:07 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lKOOUBd3wjv1saD4S6ovDlZ+haj3s4SjF+iQLLnUlRn5rY3CTSdnOvBg6JFpxDXzXzVaJT9z/puJ375vEEbPbMJwHnck+n1qWjA3SlKltF4TchrmZkVm+Gjm8buXorxkPBZBZRGYw05He0Gfc/2ZDxuXjujo0bAMyCHLOTiyBIaGZ3Y/KFwLtekjqXCcG7D7ivPV2jW/qsxqyd22EoiLyP8eTLZufFnDmsxOtp7y1yyQDVG6GlbQ/qCzLlLCtHDyYwdEqzfXEAz1SRGN+Ib0AMMD0MTaQTPODm10HGFzki1idb6vUYKyEolJkXOC8tU0UwI6zngLZi5phmyHQ6s4DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=cTQRBaCRGC5C6v+J0FtP0SeAXPgnVftQTwbk5pBby9M=; b=F2o5OikA8hAbrCrW2y0EUM7hoBZMihmJi/D4PysA+DhdrgeCQt4rkMO4s5z4i5zjcRuq9oxqlYckNbZSkBFJyWDtplHUGlgNheMchZMpdTrGGRj804ZzcYU2q64YRxNQbhizs4Knr/gBzydlQejRgFoVPECPjGIUl3sNH1fu2Vjw1ldG77kMAyWt9SYmVp1T88y4rBalurlYvN9Gr2t/5F73tj2zqKs/jwO9LpsJKE7s3S9grRe8MA1rEySi+bGEjYHzxZibNyjJxRgKNEB1X2Gj7l1+P8zyjxW6tHYrCglL8Of/hirmdZ8NbeE2K7izLA3CBj4Sg+ZmqiHv4o4CFg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cTQRBaCRGC5C6v+J0FtP0SeAXPgnVftQTwbk5pBby9M=; b=V+Li8AxDANhcWYFkVkW4sEhBWgG33kmblJRSwsGTVEKJPS2p3DBmL+Kliu4xFCp/40WhDIKZnpx54B7x4Me3C6v+272dg5S8NoZ+yQ9z+ma8o61a6nsvNedw8vc6bXs2DCe+OTimT1LbYJLd+Fu1H9LsVnRvV+1gi6XAhghY1SalcNKwNXwx1NfwBejpupdXlRvSeYci1mnp0arIYfr9qSBFcj8ioaXpBB8OocEvN6VfOO0p/C1/Itnovf7WPciaP9uA9OaPnAEumPKbUHDpMvPPAh1nuXMqD8WQjOYHzg+mRxx3aQqnGVdGSUQyLgPRbXfjFna4usKSi873q7uAag== Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) by TYWP286MB1975.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:164::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.31; Mon, 22 Jan 2024 17:46:51 +0000 Received: from OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076]) by OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM ([fe80::86fc:6255:f4c1:a076%3]) with mapi id 15.20.7202.035; Mon, 22 Jan 2024 17:46:51 +0000 From: toqsxw@outlook.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Jan 2024 01:46:28 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122174628.1206503-1-toqsxw@outlook.com> References: <20240122174628.1206503-1-toqsxw@outlook.com> X-TMN: [vOj70+50fyu8kUt5Jr+6SzllyKdiEPp/] X-ClientProxiedBy: KL1PR0401CA0027.apcprd04.prod.outlook.com (2603:1096:820:e::14) To OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:186::5) X-Microsoft-Original-Message-ID: <20240122174628.1206503-8-toqsxw@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2173:EE_|TYWP286MB1975:EE_ X-MS-Office365-Filtering-Correlation-Id: bcb70e30-50fb-44a8-d9e1-08dc1b721d2a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: R6CI7xW15OrmefJIzegl5G7tGbwPw1kmAYiopEytHt9TQfIwjBaoMXw7pgybgLYkBWDxax6BoBdx3Xy62wX38/l6bQj9lHNlQofHq7gybH37uGxynLGNvRpv+U2wxT6C62jp4qJhgEQR6DDwoT15TA2VP9o49c8CB54FjmH4R6m5C1T5b/pGrlohEr2zmp41fyWjoORuoQd0XqMlL31ygrchng2C3C28DHlmYSLjyXXWaawNWAbsHcyqx933fVoIbjLFejyXP7qy2WySe7UHEVMg3pqFbc55THSiaVgbjtikDBMKc82IKda7Qyc3VESk3/JVjSAEcXLfmcFA5DOCVbZ0Q0jViEL4IMUGweJHN4Xx7i3fQPSsOUNKdPGQVfmUbM5mUn4soXisTssUWJbYe7rRYhZkGO2wdoLwricW1vfyuOF07/yH783kKTqa/RBNFi3VGHSUV3CYfJR7r9SrtZ75sc2YzeLK3uJEeMtVAOFiylI5duI1aw/F3aKLCvkkirqh6Ho5uhOs9j9WuGcKaxBTd4u3nWn9DCNhIGH1jmw7c4/wCEUNgUZ+5nLTP6vIfxMpvv1Zv5ThD1v+TUZKro9bTwXkHR1iG3+7bEmIiv7weHX1p4KJp+JpfK526ICS X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: t34bMIKUevO6Katb5cFwRg3ZjuSliA7AQIfJnK20KYX/DsSZqjHFxW1mgCFoxNQLiyLAtI9Voo7q5QKwaxX1d/uJpY/viFHJwt5KNR+WL/BRqGOSTuWXwgAegfd0qbe3wQFDwOuq5VxkRh6lwuhcAMcQBp3mP2ENvDg+tLvuEwEEWVEi3joOejPHG73SjI3flA+8M2Uj/jhJw40wYypUAvJmiDdk9AfJETaZrlORO0un5Kkej+CX3PQ9Qt7QRsLHIX5rjmBMMswoHtWsxtIVJkeD6tmHD3yNE8ZVmDFuBPXfIAT6GOfOizh+jkGTD6960LXLPDPguCuX+dSMAKbPp8czm6DfDy0365EyovmbavCWGmwDF/jTIBMk0oJrMXOFvH41XNpXfyouJDF7Mmo06wrzlq0TijRyKS49FH53x9CPPu9PZUVjf2Tf5LxIC6MwtyYMhw/i6T54dZA59OK5ZZgO+HpDo/AphK/aCh3MO8R4k10QyrKPp9YbT7rnMmWSI7bVNM+jCUHH32pyycefB8cuphKqEjER+e33ASIOIYO3qXNQWV2fBdj/vyWU02mTsNZu7e+UXJrCe6+mGgb3x2eGBszgYlpZ9jhN1kN2OYTtHlK+0O9JsUNHs/Mh+oZzdSWdaqgSDCzSlGSELB+b3Mm3H6vcjWRdzDnbX/h9yZTCVF5AKD9R1IWP0qRQIoeQhOSZIfm0rgWv4KaOIPH+J7MAAkm7qXdyTsaR4Tle3V7rrYCHfBr2xLQHnZNTkux3c4MVgzfZqKpea+N1pembM0xTkK9P2lodGwT3g3jvmtqa7OH0aEtpqHPVl+hwZpQxynIuzwfIBCywPJyUlN3AFZKbzFIgqBbVs4Zfon4QG6lInoTSljo1ni/qZE6E9Pzq9bkQU/9hmEU5/5kbPPFO1TZrudjNTpZBKiOXxNuMEBx2EkXekwbOfaDO4RT02qQlk8D3hPPqXeD/ImsV/VdmL+59jEhXELoVtVRfv0itx2TuX4V4/Xf128Y69ITkNAVgR8XLFLM6YzM/PCscnWUot980c1UBnlkLc87/nqXyE/FW8i1lUWXn15wOO8irXQ3zL+nkzq8imjl9947DFtsLM3kDyw9CxvHnMBVFUl8/cycwmkDJZU2uKEsAxvEhYVTpinaXGPvXQa6+BrG/6bWfDlWc2yH4ocwGUJkyCt5jbquZsBhyCMAPQmEMKTnP1WaZKvCqA2zCUSrENAKRyL6TzUCt6lhBKqZJ6hHESYm90gM= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: bcb70e30-50fb-44a8-d9e1-08dc1b721d2a X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2173.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 17:46:51.1683 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1975 Subject: [FFmpeg-devel] [PATCH v3 8/8] tests/checkasm/vvc_mc: add check_avg 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 Cc: Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cUkLy5I1JNtb From: Wu Jianhua Signed-off-by: Wu Jianhua --- tests/checkasm/vvc_mc.c | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/checkasm/vvc_mc.c b/tests/checkasm/vvc_mc.c index 711280deec..8adb00573f 100644 --- a/tests/checkasm/vvc_mc.c +++ b/tests/checkasm/vvc_mc.c @@ -35,6 +35,7 @@ static const uint32_t pixel_mask[] = { 0xffffffff, 0x03ff03ff, 0x0fff0fff, 0x3fff3fff, 0xffffffff }; static const int sizes[] = { 2, 4, 8, 16, 32, 64, 128 }; +#define SIZEOF_PIXEL ((bit_depth + 7) / 8) #define PIXEL_STRIDE (MAX_CTU_SIZE * 2) #define EXTRA_BEFORE 3 #define EXTRA_AFTER 4 @@ -261,10 +262,73 @@ static void check_put_vvc_chroma_uni(void) report("put_uni_chroma"); } +#define AVG_SRC_BUF_SIZE (MAX_CTU_SIZE * MAX_CTU_SIZE) +#define AVG_DST_BUF_SIZE (MAX_PB_SIZE * MAX_PB_SIZE * 2) + +static void check_avg(void) +{ + LOCAL_ALIGNED_32(int16_t, src00, [AVG_SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(int16_t, src01, [AVG_SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(int16_t, src10, [AVG_SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(int16_t, src11, [AVG_SRC_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, dst0, [AVG_DST_BUF_SIZE]); + LOCAL_ALIGNED_32(uint8_t, dst1, [AVG_DST_BUF_SIZE]); + VVCDSPContext c; + + for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { + randomize_avg_src((uint8_t*)src00, (uint8_t*)src10, AVG_SRC_BUF_SIZE * sizeof(int16_t)); + randomize_avg_src((uint8_t*)src01, (uint8_t*)src11, AVG_SRC_BUF_SIZE * sizeof(int16_t)); + ff_vvc_dsp_init(&c, bit_depth); + for (int h = 2; h <= MAX_CTU_SIZE; h *= 2) { + for (int w = 2; w <= MAX_CTU_SIZE; w *= 2) { + { + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t dst_stride, + const int16_t *src0, const int16_t *src1, int width, int height); + if (check_func(c.inter.avg, "avg_%d_%dx%d", bit_depth, w, h)) { + memset(dst0, 0, AVG_DST_BUF_SIZE); + memset(dst1, 0, AVG_DST_BUF_SIZE); + call_ref(dst0, MAX_CTU_SIZE * SIZEOF_PIXEL, src00, src01, w, h); + call_new(dst1, MAX_CTU_SIZE * SIZEOF_PIXEL, src10, src11, w, h); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst0, MAX_CTU_SIZE * SIZEOF_PIXEL, src00, src01, w, h); + } + } + { + declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t dst_stride, + const int16_t *src0, const int16_t *src1, int width, int height, + int denom, int w0, int w1, int o0, int o1); + { + const int denom = rnd() % 8; + const int w0 = rnd() % 256 - 128; + const int w1 = rnd() % 256 - 128; + const int o0 = rnd() % 256 - 128; + const int o1 = rnd() % 256 - 128; + if (check_func(c.inter.w_avg, "w_avg_%d_%dx%d", bit_depth, w, h)) { + memset(dst0, 0, AVG_DST_BUF_SIZE); + memset(dst1, 0, AVG_DST_BUF_SIZE); + + call_ref(dst0, MAX_CTU_SIZE * SIZEOF_PIXEL, src00, src01, w, h, denom, w0, w1, o0, o1); + call_new(dst1, MAX_CTU_SIZE * SIZEOF_PIXEL, src10, src11, w, h, denom, w0, w1, o0, o1); + if (memcmp(dst0, dst1, DST_BUF_SIZE)) + fail(); + if (w == h) + bench_new(dst0, MAX_CTU_SIZE * SIZEOF_PIXEL, src00, src01, w, h, denom, w0, w1, o0, o1); + } + } + } + } + } + } + report("avg"); +} + void checkasm_check_vvc_mc(void) { check_put_vvc_luma(); check_put_vvc_luma_uni(); check_put_vvc_chroma(); check_put_vvc_chroma_uni(); + check_avg(); }