From patchwork Fri Feb 9 11:26:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Connor Worley X-Patchwork-Id: 46133 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:a586:b0:19e:8a94:b663 with SMTP id gd6csp866239pzc; Fri, 9 Feb 2024 03:35:19 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCWR+2bg0OnpZ/XzMr8UKxIDblFD3LitPUzJO5vIQPvV0AQ03JDtHhg0vEMExoig9036I25XvLjKCJ82dcWJh7JWDsTzOzGyAKfJFA== X-Google-Smtp-Source: AGHT+IGsKV0kBe5YUL7vJcXYgm4LLWAISHcWxSpyll/32xrp03AchtACdQ0KB2Pu+FXbPm/0FkrD X-Received: by 2002:a17:907:b9d3:b0:a36:5079:d6cb with SMTP id xa19-20020a170907b9d300b00a365079d6cbmr882201ejc.56.1707478519597; Fri, 09 Feb 2024 03:35:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707478519; cv=none; d=google.com; s=arc-20160816; b=Q8uRCVooyLR/iz+jT60CIfnlmk/1tHiAj7grc6brHtnB766dSC2PnWQoYi1JFhYBrD Z0JszQtumDAzfUNM864EkrTZ9zPEUQgiIrtYw/YLQkWAoF/wtk9eayvv84VT0XYwTxdM JyBkFFQ+t7iBQ3hbUFtJyuM8033tI/SD0uPz95gx2QfCahPOTl5glW3iE7+8FekVSTc9 Xxixzd7inNnlyWQjMPLJzpOgEaQWouq5yFL3VevHa2xDEEGZCGJx5BS+vfMEx+0kdpSY lfLIV7J4s0mGSPzdg1KTMofy9M3tQ4I6AGxBj149anpIWg2mZoQLQ5nyTlL92goT2lRe GaAA== 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=76ePCAX7E/MsZgQ78qOnm3XFmTXKkaWxXfWwPOTBg2A=; fh=vJnXFsTsdjJyU1FSa3Heco9XHUBAoC15izQChRud/Xg=; b=dmXqiqB2Plhs4nW2gRhE86JdT3Ou6gLMHXQYuWD6uQDcGS4FI5Wq94dVfPsxhx3d9B BKFWITuEZCkxQzY3EGs0yk2R6y0cF9PMAJCVArBNgPuZXAnQGlapHV1W8dCTpiWmGHl8 DkeeRDeOBven50NxZDVHJ6ytKpi1KiDQDtVRs5MOsXCLLxy28YjM5jFVcgNqcrjiQQNH a5IdXQ9oS+57HiDuTXHVbp2KMVnfODEnMnxRzRlyxtwB9/hzTUT9rBqoWaG2lQBmvJyF hcz/ako0uwcK0B7llUI5u32rCDTvP02lZ7R3NG3BxjvI5dNviPLuJQS1nf8LiClgwo2q iv+A==; 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=fBtyhl6a; 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=1; AJvYcCWMXlkIW8Vhi2CpWNn7mV+hSwg9gIe4gt3Q+GHJ+byyBvzEr/1kYk8xApyXSJtNbWZqVu5FP1ZJObr7D4SWph2pkBoPn2NbeXc048icizxswQbu8G5Bvlfv0DkNxtK9ZnF0QKab0SEX0RatoX7IKMp+rqrsA4cD6UHF9pnpX9XdyrtEMVo0HTjwHcnTOwmlX63Mb449zTn+N3C9cRq54gAeR2wL8lDwdZvZcZB1lYARdTzxO3wV/Mzv+I7AY1AD5w6iwSycpmocC+InUiSYjr/Df+OMoNc1q8aFIylTXLnE24RQJ8bdgvJX+MRbs3zfeLgFKjVUwl2gRT5R8hHS1OMhoc2T2pUMyLc3VVyaQjF5i3O470yAKEHi3fd4TMT8PVWBIiwjc827uGeUtnNtCABq4SRmnHM1PFFRU8JKMoVQWLd1s+HkSUHKG1s1AFIotM5mWwzXegenDrCab5BlSwzAN+FZGmtaUx34FRQKf1uu7vK5SoHJWlrxmFovMTrXtQ8o1WU/iPiaDVIAPpGrcBEUxEMcjHr37lK6XM8uOyd7US3ljIu6wDGE+HAoIwxe/4zX6kArm1AUixT7H06LL4AT8805OsESP5IQ7iHwPurNe2YUbSk9U+8F23r8vlpJx+paHdUnkbWOgtXlqH/9gDen+K02G0QM9QaBxgAYpNglT42yNjd8ZdIXdkWM1sDqPDcgI2hrqwQmpLhBkE8wEp3W4UT4SQvIThYUUUvPnhWBKAHGCvge1Nf+uLyXZXC9j6y4Pfg468JMTmHwmxHYWum3RWzV6eeHdF3PBLDAf+cYpWTUCh8K10yIHbH3iZaYIKPkALYeBsDf/X0IKLJBgMSjRYWWK6mQ8ih0aQOrC/0x+jf81N09JMLKXNHkUVWk2i9dOVVeF/uZF1rhqDPVYmDe3KBIosLdSsYjeSyDBQuaIR3PmGi9+0o6bChQTsGMOD0dig r4ndoeZgxvRxQSrJpV6Qd5qhgbV3U0x67zbcdZi2Ujl69yPWJ7QzWbEpME7x1RVSKntCoDFlN25SFGCHkDPWXEYFjH3WMu2Ty7rVRPuxEsypd/0WGfaieYGZHk0zGJ90BxjFs5a+HCWpmlrbngjfKT2u0jlY4JkeGjymbxIIly8o/18BjsM4uJHe99iX73itb6aiFIRPqCQZ5nkDLR+kALOEWUCqbzlg1lWTOCL87vGbuZMv3ST6Am62UjMypB3IBqZuWSUupePp1VD4unZQ2y6asA93K2FrldVCNYsXzoRB4hyD6jh7NMKLD74BQJcmN8cu25G7s63axcQtlRujE/WRY/ZEdzk4fWoBLiVqfHneXQEQnWGLIQ58qo7k8VpfdYcysOK1WbkzUHRmo/z7pXrumeLRND3s6lDw9oBK/ybcIgb3EeokZVplTN/PE4DfGnHLEpLp+DgpfOHsyT1liZtlOQswd7jAL7td7rKtGmYNDfZT7wLB79GG11rWamIEXSev4+EWdWHjsx73tk6SWuxDDUft2ArsI0X8Kbw3Jl2AvcT+7oTogbg1zlvlZlZwbOPZJlQrtO0A5s7ktXxC6uS8qWhGYSwtak2tMhm1OmGkz197DKKCtYkm7fhJ16o+bl Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id le1-20020a170907170100b00a37a267e2e9si717327ejc.879.2024.02.09.03.35.19; Fri, 09 Feb 2024 03:35:19 -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=fBtyhl6a; 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 26DA268C496; Fri, 9 Feb 2024 13:35:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 46AEF68CC0A for ; Fri, 9 Feb 2024 13:35:09 +0200 (EET) Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1d93edfa76dso6816895ad.1 for ; Fri, 09 Feb 2024 03:35:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707478506; x=1708083306; 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=1hdwlpmK9LupEE5xhVJXz8xlx9pA0QoSr9LkLSB+OQs=; b=fBtyhl6aa+yFHOlY0E5BhGIsdAgctxX4Jgdg7tL1ibnBNZFREwvDKDEz2KTZWTJ1xA ltozMtZ3IIlEZ4sh2eo3DAK5dvip6AcsoxiubJ7YLnDnrih4po7vuKP81nVkI6p1220F 3T9kxYEdlPfzsldwWKtoHxf7Tm0YlVqFCtSVhxbzlpqrPPQvl1XCBmV88uMbPntaK/KR nY5UscDIZ1kuZR1fDg+Yiay4zR0XHvKL4Nk83z4GRd9VuK0mDAoSeGxpELVh4P5J0lk5 Xcx4C7FEzD+/CmGOfm0efEoOM3Ums4Eh+uXLxpzUT/FrjzIUw8kQhUsZwo7XU+p3XP9R vNdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707478506; x=1708083306; 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=1hdwlpmK9LupEE5xhVJXz8xlx9pA0QoSr9LkLSB+OQs=; b=PcRKDFFhbRQrbWQKWiJ7WsH5cK4UTiT9NQRDo/L0YwtKk3v0tSNWqNwFuBZvYupm3R 7hK4Dpht+ZDk5zeblMzNAe8qmZVlk4zZkjllWRhZPSdWhycCerGn33WRTlWznsaz4SFM +7snkKPjP8cOAve6DS+JeMvrhlMP8kMjHDsZ+Eox2vAb+NPnaJLidBa9VaHz1wd6v7go FcTQAmEbtja8HrFw7PyGiInESiMvgmg6gYZi49ckKBw17NYmqn+nGWq6yK4Q2QVWiRA/ R+kiB+7uJqY7EHEF8k7FhpW5lZweYWlwrhFNn5w8uFfTc8YhH2Fdo5IyXkUlzf423QKM ycAg== X-Gm-Message-State: AOJu0Yy4+Zwx37bv2Dn77MeOX5sSfCBUcgmd62W84wT38z5LrY/fR6hO oAwyxDlO7oH5cAFmidLz7JiJU894a7uyCxNiVSl8gAfrV88BECjSClqsQH68hLI= X-Received: by 2002:a17:90a:854c:b0:293:f16d:e53f with SMTP id a12-20020a17090a854c00b00293f16de53fmr1320300pjw.0.1707478506478; Fri, 09 Feb 2024 03:35:06 -0800 (PST) Received: from localhost ([2601:647:4600:84e0:24b5:a909:c5a1:ea01]) by smtp.gmail.com with UTF8SMTPSA id iq6-20020a17090afb4600b0029619c8fa15sm1532756pjb.27.2024.02.09.03.35.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Feb 2024 03:35:05 -0800 (PST) From: Connor Worley To: ffmpeg-devel@ffmpeg.org Date: Fri, 9 Feb 2024 03:26:50 -0800 Message-Id: <20240209112649.16556-1-connorbworley@gmail.com> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] lavc/dxv: align to 4x4 blocks instead of 16x16 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: A/PIod5d/7gV The previous assumption that DXV needs to be aligned to 16x16 was erroneous. 4x4 works just as well, and FATE decoder tests pass for all texture formats. On the encoder side, we should reject input that isn't 4x4 aligned, like the HAP encoder does, and stop aligning to 16x16. This both solves the uninitialized reads causing current FATE tests to fail and produces smaller encoded outputs. With regard to correctness, I've checked the decoding path by encoding a real-world sample with git master, and decoding it with ffmpeg -i dxt1-master.mov -c:v rawvideo -f framecrc - The results are exactly the same between master and this patch. On the encoding side, I've encoded a real-world sample with both master and this patch, and decoded both versions with ffmpeg -i dxt1-{master,patch}.mov -c:v rawvideo -f framecrc - Under this patch, results for both inputs are exactly the same. In other words, the extra padding gained by 16x16 alignment over 4x4 alignment has no impact on decoded video. Signed-off-by: Connor Worley --- libavcodec/dxv.c | 6 +++--- libavcodec/dxvenc.c | 14 +++++++++++--- tests/ref/fate/dxv3enc-dxt1 | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) -- 2.40.1 diff --git a/libavcodec/dxv.c b/libavcodec/dxv.c index e1c7cee3e8..9261a5cac1 100644 --- a/libavcodec/dxv.c +++ b/libavcodec/dxv.c @@ -1238,9 +1238,9 @@ static int dxv_init(AVCodecContext *avctx) return ret; } - /* Codec requires 16x16 alignment. */ - avctx->coded_width = FFALIGN(avctx->width, 16); - avctx->coded_height = FFALIGN(avctx->height, 16); + /* Since codec is based on 4x4 blocks, size is aligned to 4 */ + avctx->coded_width = FFALIGN(avctx->width, TEXTURE_BLOCK_W); + avctx->coded_height = FFALIGN(avctx->height, TEXTURE_BLOCK_H); ff_texturedsp_init(&ctx->texdsp); diff --git a/libavcodec/dxvenc.c b/libavcodec/dxvenc.c index b274175689..33a18d53d8 100644 --- a/libavcodec/dxvenc.c +++ b/libavcodec/dxvenc.c @@ -275,6 +275,14 @@ static av_cold int dxv_init(AVCodecContext *avctx) return ret; } + if (avctx->width % TEXTURE_BLOCK_W || avctx->height % TEXTURE_BLOCK_H) { + av_log(avctx, + AV_LOG_ERROR, + "Video size %dx%d is not multiple of "AV_STRINGIFY(TEXTURE_BLOCK_W)"x"AV_STRINGIFY(TEXTURE_BLOCK_H)".\n", + avctx->width, avctx->height); + return AVERROR_INVALIDDATA; + } + ff_texturedspenc_init(&texdsp); switch (ctx->tex_fmt) { @@ -288,10 +296,10 @@ static av_cold int dxv_init(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } ctx->enc.raw_ratio = 16; - ctx->tex_size = FFALIGN(avctx->width, 16) / TEXTURE_BLOCK_W * - FFALIGN(avctx->height, 16) / TEXTURE_BLOCK_H * + ctx->tex_size = avctx->width / TEXTURE_BLOCK_W * + avctx->height / TEXTURE_BLOCK_H * ctx->enc.tex_ratio; - ctx->enc.slice_count = av_clip(avctx->thread_count, 1, FFALIGN(avctx->height, 16) / TEXTURE_BLOCK_H); + ctx->enc.slice_count = av_clip(avctx->thread_count, 1, avctx->height / TEXTURE_BLOCK_H); ctx->tex_data = av_malloc(ctx->tex_size); if (!ctx->tex_data) { diff --git a/tests/ref/fate/dxv3enc-dxt1 b/tests/ref/fate/dxv3enc-dxt1 index 3cfd73397e..74849a8031 100644 --- a/tests/ref/fate/dxv3enc-dxt1 +++ b/tests/ref/fate/dxv3enc-dxt1 @@ -3,4 +3,4 @@ #codec_id 0: dxv #dimensions 0: 1920x1080 #sar 0: 1/1 -0, 0, 0, 1, 76767, 0x932ecbfa +0, 0, 0, 1, 76521, 0xed387a5e