From patchwork Wed Mar 30 20:31:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 35087 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp1011303pzb; Wed, 30 Mar 2022 13:33:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyD3HU12vuXL5gdfTBIbDuPbHEV7QBV9fSL3saeqU6aiQbP3FLD+gM3UuNujdR3rS2QgF26 X-Received: by 2002:a05:6402:4315:b0:419:2e38:ab8f with SMTP id m21-20020a056402431500b004192e38ab8fmr13109796edc.250.1648672395666; Wed, 30 Mar 2022 13:33:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648672395; cv=none; d=google.com; s=arc-20160816; b=ario17SF9xPfDzNKTkWAb95XTx+PlcRk8AfsYWiv7qHmT58LnUko1oRhsh8CXI/GRr j8d/WUDNQsWCFf1zKb59tf4KdWgx7GiKO5HVkYsPMgjc3USYSxGBrPo8rObzBxNSO53i DG5+8JwdXP8iYsRREeqQUcDdzHb6m8ce3fv012g2yE9TIYw9eq0zYO2U6ZktBdEqDCPV cwszs4Rf8lD4jIA/aYE/p0hWhg2OQdoDMb811VU2EJhlL4lvFAYnYR06MEzH+FCLl0yR 20ccpY/Wuxxwhu5wsic9DNdBx/h5ONAFy1ii5FW1rCxpXMURfSheN1Gabmzf1ptcnQ8O 7VHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=deGamJuN/t46Q4x5HYvQiZSPVAUp1QGLFfSTR1aQSXs=; b=UoS/C42BwjKjNMIg/ucP0pOswslrvS1q88jfkxxMFtZVAFDZLe8B9m7zGh2q8RHhHz UKW8ngG2/FWYjNqS+r1/JxyMvBZ7agmyotRyhTJ2zn3zm8ingqlfUzjhlQbv2Jhn0qbT f/49r30OB64q98XCe4EbMLVZRDGol3CAuVzZdnmv/Lpi46h8tfW6GFpH84ow/vniBwk6 z8HfGgDs8WDM6tEd7fae2TFFHRat6QdtPq3hv8XeEUaYQHWlD8FuHrF6uQ+BQulVAody lm8B1HOs39LGeVNpx+2XxYANQEHPJSV/F5kq9EojmM9JtTz86qqbz6cWgGCi0M7nVqa4 EF2A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s15-20020a170906bc4f00b006dfe6119763si21769345ejv.325.2022.03.30.13.33.11; Wed, 30 Mar 2022 13:33:15 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 18E4868B256; Wed, 30 Mar 2022 23:32:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B93BE68B093 for ; Wed, 30 Mar 2022 23:32:14 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 4598BE67E5; Wed, 30 Mar 2022 22:32:15 +0200 (CEST) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id otFIDeMl-vNj; Wed, 30 Mar 2022 22:32:13 +0200 (CEST) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 94595E6BB6; Wed, 30 Mar 2022 22:32:13 +0200 (CEST) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Mar 2022 22:31:59 +0200 Message-Id: <20220330203205.25937-2-cus@passwd.hu> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220330203205.25937-1-cus@passwd.hu> References: <20220330203205.25937-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/8] avcodec/texturedsp: add TextureDSPThreadContext for common decode/encode function 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LdyTkw8nXvds This will allow using a common threaded decode or encode function from most codecs using texture DSP functions. Signed-off-by: Marton Balint --- libavcodec/texturedsp.c | 4 +++ libavcodec/texturedsp.h | 23 +++++++++++++ libavcodec/texturedsp_template.c | 57 ++++++++++++++++++++++++++++++++ libavcodec/texturedspenc.c | 4 +++ 4 files changed, 88 insertions(+) create mode 100644 libavcodec/texturedsp_template.c diff --git a/libavcodec/texturedsp.c b/libavcodec/texturedsp.c index b7dd8baa12..b8938213ef 100644 --- a/libavcodec/texturedsp.c +++ b/libavcodec/texturedsp.c @@ -652,3 +652,7 @@ av_cold void ff_texturedsp_init(TextureDSPContext *c) c->rgtc2u_block = rgtc2u_block; c->dxn3dc_block = dxn3dc_block; } + +#define TEXTUREDSP_FUNC_NAME ff_texturedsp_decompress_thread +#define TEXTUREDSP_TEX_FUNC(a, b, c) tex_funct(a, b, c) +#include "texturedsp_template.c" diff --git a/libavcodec/texturedsp.h b/libavcodec/texturedsp.h index 90ceb2b6aa..e15d3c2b02 100644 --- a/libavcodec/texturedsp.h +++ b/libavcodec/texturedsp.h @@ -39,6 +39,8 @@ #include #include +#include "avcodec.h" + #define TEXTURE_BLOCK_W 4 #define TEXTURE_BLOCK_H 4 @@ -60,7 +62,28 @@ typedef struct TextureDSPContext { int (*dxn3dc_block) (uint8_t *dst, ptrdiff_t stride, const uint8_t *block); } TextureDSPContext; +typedef struct TextureDSPThreadContext { + union { + const uint8_t *in; // Input frame data + uint8_t *out; // Output frame data + } frame_data; + ptrdiff_t stride; // Frame linesize + union { + const uint8_t *in; // Compressed texture for decompression + uint8_t *out; // Compressed texture of compression + } tex_data; + int tex_ratio; // Number of compressed bytes in a texture block + int raw_ratio; // Number bytes in a line of a raw block + int slice_count; // Number of slices for threaded operations + + /* Pointer to the selected compress or decompress function. */ + int (*tex_funct)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block); +} TextureDSPThreadContext; + void ff_texturedsp_init(TextureDSPContext *c); void ff_texturedspenc_init(TextureDSPContext *c); +int ff_texturedsp_decompress_thread(AVCodecContext *avctx, void *arg, int slice, int thread_nb); +int ff_texturedsp_compress_thread(AVCodecContext *avctx, void *arg, int slice, int thread_nb); + #endif /* AVCODEC_TEXTUREDSP_H */ diff --git a/libavcodec/texturedsp_template.c b/libavcodec/texturedsp_template.c new file mode 100644 index 0000000000..bd193aa97c --- /dev/null +++ b/libavcodec/texturedsp_template.c @@ -0,0 +1,57 @@ +/* + * Texture block compression and decompression + * Copyright (C) 2015 Vittorio Giovara + * + * 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 + * + */ + +int TEXTUREDSP_FUNC_NAME(AVCodecContext *avctx, void *arg, + int slice, int thread_nb) +{ + TextureDSPThreadContext *ctx = arg; + uint8_t *d = ctx->tex_data.out; + int w_block = avctx->coded_width / TEXTURE_BLOCK_W; + int h_block = avctx->coded_height / TEXTURE_BLOCK_H; + int x, y; + int start_slice, end_slice; + int base_blocks_per_slice = h_block / ctx->slice_count; + int remainder_blocks = h_block % ctx->slice_count; + + /* When the frame height (in blocks) doesn't divide evenly between the + * number of slices, spread the remaining blocks evenly between the first + * operations */ + start_slice = slice * base_blocks_per_slice; + /* Add any extra blocks (one per slice) that have been added before this slice */ + start_slice += FFMIN(slice, remainder_blocks); + + end_slice = start_slice + base_blocks_per_slice; + /* Add an extra block if there are still remainder blocks to be accounted for */ + if (slice < remainder_blocks) + end_slice++; + + for (y = start_slice; y < end_slice; y++) { + uint8_t *p = ctx->frame_data.out + y * ctx->stride * TEXTURE_BLOCK_H; + int off = y * w_block; + for (x = 0; x < w_block; x++) { + ctx->TEXTUREDSP_TEX_FUNC(p + x * ctx->raw_ratio, ctx->stride, + d + (off + x) * ctx->tex_ratio); + } + } + + return 0; +} diff --git a/libavcodec/texturedspenc.c b/libavcodec/texturedspenc.c index 3d68e0cf39..381be16f75 100644 --- a/libavcodec/texturedspenc.c +++ b/libavcodec/texturedspenc.c @@ -670,3 +670,7 @@ av_cold void ff_texturedspenc_init(TextureDSPContext *c) c->dxt5ys_block = dxt5ys_block; c->rgtc1u_alpha_block = rgtc1u_alpha_block; } + +#define TEXTUREDSP_FUNC_NAME ff_texturedsp_compress_thread +#define TEXTUREDSP_TEX_FUNC(a, b, c) tex_funct(c, b, a) +#include "texturedsp_template.c"