From patchwork Fri Feb 2 00:34:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Connor Worley X-Patchwork-Id: 45965 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a28:b0:199:de12:6fa6 with SMTP id cj40csp638722pzb; Thu, 1 Feb 2024 16:34:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IG01BYFLUrJhZ3DznHdxJz8+nQuuegOZlAxXMBGR/O8xCVp8X1EvM9jdLj8987TwSXp3Ugx X-Received: by 2002:a17:906:cb96:b0:a35:ec2a:2974 with SMTP id mf22-20020a170906cb9600b00a35ec2a2974mr381904ejb.37.1706834099015; Thu, 01 Feb 2024 16:34:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706834099; cv=none; d=google.com; s=arc-20160816; b=JJVgl2KhHY3U9bvANxWzLJAEI0vvClnQUWE36kUiV2aZhnvP5yhclkBUC3eISf7XCO GjIv3Ztk/+0LFL+2dkOoGxeiKknMYLQE4AmFeqAGQRIGMl7GOg7lIUj3gXSMAL+clf1c 17zlrk3NEOg2G99+6nnMkpkmiCdfDuL1wZdEmumSpkbtV+ZyX+rB+XWI/yPueSzVOlWZ MUEp9k+NjBK6h1BqVwVPlHcJj25ucJ7Z1AUhApLfyoASh2eTaf2C7y9VfzCmLKmGJQDW NLeZUwqnb6jlTclVAv8no9IrJl3+fbqefKM3OgkRRQ+GbY+7tc8H5OVjKGGSnFaBRkuF nJ5g== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=16WR62aKMhonqATqkz+iZCZADAHmkY5sOY9PMIkfncA=; fh=TOzYdCnhOopJQgvmVjXJJRgP4e/INHdSoClSyvPt3NM=; b=Pi3oiKZgvpnHq4UjKAgW+XiJt0B3j6xJ+ksxbiAt5ExGKS1uL2tvFszv1n+GdTTQrq 7Gig65h7psGS55hz84CiZARz4BOXj9Pn6VbebymHE4nF5ej/iwEW2cuXP2sYnNZsJUvK EwW0+kPHEFxN1W0Kpdra4CeBLrtvUi2Jl+2bHlRSd8ZOH9HCAgGQiIkO0ckYd/2HwBgI wQWMKhTU6zQbBMM5jQUThoU1QSxttrazW2nGXQJ6fxObgTxNL6vLcoqu4aw9tHQv6V9h tfVyTnqwCyKGPR6WjyOogmnZQbyRjUx+CMxwcunBjJMB/V125/EOdGEc4WW+62mL+Sqs Sh8g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=lia9YzjX; 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=gmail.com X-Forwarded-Encrypted: i=0; AJvYcCWe1v9/wUDHl2fL2TkjPC0AP4aoLx12EOP1Ow7nSdtmz3rhEuCG8SUDQMeOVY7CPSHmCe8mBImI9mW3NxsrLHci/8sW2IxjwTnyOua5tqc2Y30Mf/AivlDKBJAxxJYw4LdQrlwUGZx63QORpgaxSUt0ielEMIugzx5g3N39qyMOt8vhmKQ3+UKBr/jIgY7rcizyHGK9j7MWRL1OlZkt5nHOOrTST3j8MPi4tZ1yMGiZsda+0LFX30b95VOCOBgMqRh2M1l2a+KSgp4WwdTPCEYIp03K7D0bqVgaB4fGEPM2Nln1O5r1Gj+NZDjHuRBAaCKkWLQvEAELN9rhm3ieXK/ZNixlDFhBgzQLKLGkNzfbSC9sO3FH0aszghX8ssEtzfeQ7hzrLaDr1ptLBp/Nqiw0HkYIMici5K18wyGyAIyxFegqHdmOfAx2U58giSA4Rvkp0fU6FnGaAjKAwF9BQFp5+7pauJU7MapGwJyAeFRipQiGRdHCTtDnAnx/mEfArVEwe60DzkcEtbErs+edxe2h4jnldfkII+JUjJFHlDOufktXZDGE+A3XfNWjwSGIq5fHoJSX9tSlrjxrhEYnnpcznxHorIaO7jhvDlbjVBD9WfsYzrM857tQhYY8DtCBhp0a/E2tQYme2BLBanZvLCzftBRfHK4aej6XAOnf/yBGeLbpRdqsWPjmiOZwD7509EO4n4NDWMVIKK2tpU0RaJRYcWNhbKGJrOFV17e1ZcOjpVaGYSwQ2I1lh5YTctrc62ksurSKyaIhKu3PDcu6Rr1VuOBJ7nT4XZci3Dadlm/sPZF78bunC+T8AXRwAzJ1xLpi+S1v2fb3xt45616t5ehkCWfJ4WADECIMo30snlEqlcNSd7wNfnKJSxrg9mbnn/l+UZq1srcxZExNxcKNoZNMXhiTTXsEtxoFREaPwYyT8ewgWagS7PawDBxRSoG1X5c3zx JCS4KNy0E+0VCSK5htm2gQSuQQnGBovCSbCge1V7Uzsresocrx4FZGwcIrMLIH7fHDzJTyiNk52TY1rPmMKTvTSYVduHihnb68Juv/qlDe+sMjBiuZ2Me4xhFe+EGylj9kgOXOT8zboljsEWRYzcu8qQtdngv4OOZxHuBIlq9VtHQDghG1x8iDylKaLpySosJw0XqABetVDkGx58qC9+fpl8nDRIi4HT9s5FQ8hAXmnBRVsnl/sK0oozA4NL9hObD6vgxO32Q/2clsGC4gtztzfwHCooNqy+235YyBBQiRknrXPr2RkxWs5xbFiYMjDCkz1YHIinlg1CwZvcGdgb+XJ+zFPLsRlD+CgT7O+dsZdDtR49qI5R9NwDxoBzkGdmakVcTpa8oaBTZ8mQ1sReh4S14eiQppiJUnBRluLzpBVFT4koT0MHIZn3JhOdk/01q+z0P5PP8AWbes3LfdGGucNy9wL4/h+m8uzU88fyxeIl2tcwzYGXoPpXsr0kH8sGTsjmGfa1QeaQwg3BpRRMJxOS0iielkY+IxyCPTbZU9iwFchlbeIutxNOf/RCUbAkNWKlfRAvAZPRYJ0Oz++t0HMe07aJaNX6LW4NbM Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u22-20020a1709063b9600b00a31a3f16712si282509ejf.252.2024.02.01.16.34.58; Thu, 01 Feb 2024 16:34:58 -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=@gmail.com header.s=20230601 header.b=lia9YzjX; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 36CEB68D128; Fri, 2 Feb 2024 02:34:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D850568D010 for ; Fri, 2 Feb 2024 02:34:49 +0200 (EET) Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-1d93ddd76adso12170205ad.2 for ; Thu, 01 Feb 2024 16:34:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706834087; x=1707438887; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=SATP9xZ9q35gRJ4HHd5mWCA+xELxmC5R8+XSSsJxVa8=; b=lia9YzjXGSXHVqXbx8mF6hzeREDxlluyNBPMrhmpiU71x6VVoozsUPVx1WiaCQZPLx 8wu7pZ3KoftWoM5Aab52/x73SEa3tsk92FTh9aTcah7LEceRlY0vPMGxcBmL2gJy/L9p LiTZ2BtNNzWoD0n6tfv9UQ0FLWqjH1I/u7ybMuF68ttMV8z6TUwriun49eI8qWgIZ15x xiil5LeAEGYm0eCgfJS14eM0JItxvjVe5rO+r8ioTVIFvJIETslyKaCEXo7WIdpTNCp2 jYKk6avNJ2zyJLZCODtZk/SPGo89qyTF5iB4uuMznjXMaZvbc9XSOI9w+D25m6Xxy074 Kapw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706834087; x=1707438887; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SATP9xZ9q35gRJ4HHd5mWCA+xELxmC5R8+XSSsJxVa8=; b=qt1KCj/ZM62uQ2Mtjtt62BiReWfq5awghvnc6UQNW3ZVbkvfd834LXlFLk40fT/w7D Yewu3iFAEKZnEVmt4t4K1Lpz/JZJIWeaD2OJUegpP36Q2C7BW/1wVF8dkXoZqC3WZbIK nsy+T9vMK5KrhtqD1Kcv/k1UppOXrz4lGSOtGCEas+p+Jwwo0zPOeRpMHw46JmcOe2Wj oULOszihhGu3V4zgFbgYZw6NblZdtxsX9UXJI57t564dZf2r/0faPeEZ/28vD04XRD5S XZuiiI1udU/W6jqFL+NtF/78uqBIDC7cZQqB0HifbevdOkbQEuYL0NQtZYIp4693oWJV CN8w== X-Gm-Message-State: AOJu0YxA0vDNZj40s1D8T4jxE0uDDRTwsf1ruyH/0SCnBSWFbIr+D1Pz bUA1XtiOsslYTr2/pQdBXaPGek7VoFH7EqDg5XoUAVJThigmbQFMoH5J61iE X-Received: by 2002:a17:902:820b:b0:1d8:d478:8b90 with SMTP id x11-20020a170902820b00b001d8d4788b90mr5831967pln.16.1706834087379; Thu, 01 Feb 2024 16:34:47 -0800 (PST) Received: from localhost ([2607:fb10:7301::3]) by smtp.gmail.com with UTF8SMTPSA id ji7-20020a170903324700b001d944bf2d83sm419800plb.7.2024.02.01.16.34.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 01 Feb 2024 16:34:46 -0800 (PST) From: Connor Worley To: ffmpeg-devel@ffmpeg.org Date: Thu, 1 Feb 2024 16:34:44 -0800 Message-Id: <20240202003444.30893-1-connorbworley@gmail.com> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavc/texturedsp: add DXT4 texturedspenc 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: Connor Worley Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wBf4iJdZ8udy For future use in lavc/dxvenc. Signed-off-by: Connor Worley --- libavcodec/texturedsp.h | 1 + libavcodec/texturedspenc.c | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/libavcodec/texturedsp.h b/libavcodec/texturedsp.h index 86c8eea02d..8881436187 100644 --- a/libavcodec/texturedsp.h +++ b/libavcodec/texturedsp.h @@ -62,6 +62,7 @@ typedef struct TextureDSPContext { typedef struct TextureDSPEncContext { int (*dxt1_block) (uint8_t *dst, ptrdiff_t stride, const uint8_t *block); + int (*dxt4_block) (uint8_t *dst, ptrdiff_t stride, const uint8_t *block); int (*dxt5_block) (uint8_t *dst, ptrdiff_t stride, const uint8_t *block); int (*dxt5ys_block) (uint8_t *dst, ptrdiff_t stride, const uint8_t *block); } TextureDSPEncContext; diff --git a/libavcodec/texturedspenc.c b/libavcodec/texturedspenc.c index 5657a6ef61..c98a277f56 100644 --- a/libavcodec/texturedspenc.c +++ b/libavcodec/texturedspenc.c @@ -589,6 +589,20 @@ static void rgba2ycocg(uint8_t *dst, const uint8_t *pixel) dst[3] = av_clip_uint8(g + t); /* Y */ } +/** Convert a straight alpha pixel to a premultiplied alpha pixel. */ +static av_always_inline void straight2premult(uint8_t *dst, const uint8_t *src) +{ + const int r = src[0]; + const int g = src[1]; + const int b = src[2]; + const int a = src[3]; /* unchanged */ + + dst[0] = (uint8_t) r * a / 255; + dst[1] = (uint8_t) g * a / 255; + dst[2] = (uint8_t) b * a / 255; + dst[3] = a; +} + /** * Compress one block of RGBA pixels in a DXT1 texture and store the * resulting bytes in 'dst'. Alpha is not preserved. @@ -605,6 +619,32 @@ static int dxt1_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block) return 8; } +/** + * Compress one block of RGBA pixels in a DXT4 texture and store the + * resulting bytes in 'dst'. Alpha is preserved. + * + * @param dst output buffer. + * @param stride scanline in bytes. + * @param block block to compress. + * @return how much texture data has been written. + */ +static int dxt4_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block) +{ + int x, y; + uint8_t premult[64]; + + for (y = 0; y < 4; y++) { + for (x = 0; x < 4; x++) { + straight2premult(premult + x * 4 + y * 16, block + x * 4 + y * stride); + } + } + + compress_alpha(dst, 16, premult); + compress_color(dst + 8, 16, premult); + + return 16; +} + /** * Compress one block of RGBA pixels in a DXT5 texture and store the * resulting bytes in 'dst'. Alpha is preserved. @@ -650,6 +690,7 @@ static int dxt5ys_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block) av_cold void ff_texturedspenc_init(TextureDSPEncContext *c) { c->dxt1_block = dxt1_block; + c->dxt4_block = dxt4_block; c->dxt5_block = dxt5_block; c->dxt5ys_block = dxt5ys_block; }