From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 75E0C4DA8C for <ffmpegdev@gitmailbox.com>; Tue, 22 Apr 2025 07:59:56 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D73DD68A43A; Tue, 22 Apr 2025 10:59:51 +0300 (EEST) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2096.outbound.protection.outlook.com [40.92.89.96]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5885568813B for <ffmpeg-devel@ffmpeg.org>; Tue, 22 Apr 2025 10:59:45 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=czextGl6wySNDkOoE3DLcQtDi31xL3dB8Ait7P0LjZfd0M9Gi075qcEk6OgzuS5iTLJHPfaMDtcDyz04okWJGKFaN0iT4CkCePKASdAGO6AZHqtoRt6RnI8PYbuq5RsH7X6HGoP0JOPvQa1QSu44z8sARZhNoiPheyv0dBxYCpCGWHh3iaHUS609vbT55nSxjKUY3BNxq63h3SSfDZLK1SZyArTsc3uIUmkpTThBUTs46eQN4tqESdPeLqyfzOMkLmtkhLisHReqUul2h7oPw6FIEyUNPHz6YAR4eRtGbXgxwCg+XcnzhAxIlM8zuqgeh2tAQM8EbX0Qr1mFE1aQiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Pid6gUb8Zz95JXFPW8N2YkgGS3k7+sP2AeXcz0l8BDM=; b=uh0qB6mempJtBC9aEZzBC6z2nPib7+06J1Y3q2ubBrJUTUXtZCxR6yzJ+NUn7NrVp7G1o+2cyqUBwn7UYwBigVNArnEBRH++Eci6v4IUpE2ebtbAXVGrJpT0KF4yQ5G2lDhhM+VIrhkKSeRa3+tqPhcE89eYSedSFpCWQTIxOnTRxICKjO11e+6XVlsVzEeHdNxMPTrMJXfCgOeeOF97KQyiIgxy6sPvKUGKx9Qqqt5hVZE0H9tAkVV9AKe2PUbi2YWr8+5cNG8pXsRSbInQIowhARnQzna5YqDxGUNioOz2ClzKjnN6uXLKnbGAES8jIWw/MQnAzJtzzSRMGtuv4Q== 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=Pid6gUb8Zz95JXFPW8N2YkgGS3k7+sP2AeXcz0l8BDM=; b=nT5iCaZkDLBEPv34lOUdmc8JtwrZ9R1qC0sv/GucZRvl2gpU3k8tcvq5Lqzqns7SupunQK/a2PU16Xw762Sg6zwslPTalwrEjuSMhRgGmMp69kkR2qVE5J2cMlrJOpLPk2i2vY2TjoOFj2sAxxqYlDe/GXy0kSZzQsbEaeZy57uiRQOyt2/547wFGLAHIdAaeSFY96Y1k7s4pehpVRhzSEsky4tJr28wBU4A6CBy0L5ZpKeFJfDhI8/0LnO63oWXJ3jUxiszcXKZBP9OIyGkDv8ZMOy6Jr3yhl8imkrJc3BVFyrW/hU8WwTUUOg3BCBGyXUaJ1rpXvslPqjZ7Fr8vw== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AM8P250MB0373.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:328::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.33; Tue, 22 Apr 2025 07:59:43 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 07:59:43 +0000 Message-ID: <GV1P250MB07376A4D09A031A34A8D108C8FBB2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> Date: Tue, 22 Apr 2025 09:59:36 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20250422074254.77328-1-emma@emma.gg> <20250422074254.77328-3-emma@emma.gg> Content-Language: en-US From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> In-Reply-To: <20250422074254.77328-3-emma@emma.gg> X-ClientProxiedBy: FR4P281CA0222.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e4::8) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <c001d8de-9f49-453f-ad64-6fdc984f29e8@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AM8P250MB0373:EE_ X-MS-Office365-Filtering-Correlation-Id: 9788ccaa-bd1b-41a7-6355-08dd8173a402 X-Microsoft-Antispam: BCL:0; ARA:14566002|6090799003|461199028|15080799006|7092599003|5072599009|19110799003|8060799006|3412199025|440099028|41001999003; X-Microsoft-Antispam-Message-Info: =?utf-8?B?a0JUa0NYQkhwTFYxMndGU1R0WndGR2NRREdUSlJsdGVwL2ZiWU5nMkJQaldB?= =?utf-8?B?NEhDMWcxK1lYejRvMHl2aXIzWEJHSzIrMWIweWdtK0pqMUVMeTNrdFhRcU1P?= =?utf-8?B?RDJyRHEya1kvWlN0SnpyRVV0aGpLRUliVW51cGpKOVh4bWxNNGh0QlAzWXBO?= =?utf-8?B?NnhOOFd6cllmMlRwRkVnVWgwRDRUbUdTWmFqOTdFRW1yWHlrOSt4ekQzQ2RV?= =?utf-8?B?NXowOTVTeGpVdWEzRm90Q3dPVFNPRnlDbGwzaDFSMVo5eUc0T3FILzZBUGhK?= =?utf-8?B?ZDhRRFRkZ2E1eWdjSXFwb0J3TnBLK1VpU0hiVFFNczNvSDFvd0RDOWFUZTZV?= =?utf-8?B?VTU0L2JOeWp1Q0JXZVFyK0FSVTA0d1lCN3E5aURPYThqTDJhczBqcHdMNzY5?= =?utf-8?B?UzAyc1JCRVd5aWFTTnFBbFhFZW55Z24rS3Bia0haN09DN3Jac3gySXZrbUpy?= =?utf-8?B?SWRPZTZDaE5IajVSajNwY1ZGWW96aE1ySHhGNGhQK3NhaFZGdlB0T3VVU3Ir?= =?utf-8?B?TVVyOW0xb1ZSRDRSYm5lZXJyeGFTWUJ6YXhoTnh0SmJJS09PZEcxYlQ3cVZZ?= =?utf-8?B?QjBGcXpVSUFqMmYxMXIvUTVYZ3FYcUhseXhablpKblVGT2xXK1Z4SDRxVlZv?= =?utf-8?B?SXlDUEovNnIrQlROSWFwK1hod2NIU2JqSWtaUVE0VHhqbG5nMFplVTdoUHIx?= =?utf-8?B?eklxTkUxVE5EREFVRzFHOUxwNHUwZk9XRHZVaEJoaGdZUUFzblNYY3VKZmlE?= =?utf-8?B?c0dGWXU4aDhTWDh2TWU1V1dlM2pvNEE4TTZzTnJYZDdkYk9ydElHbDhRalR3?= =?utf-8?B?ZUFpc3ljL0NvUU9LYkdhNWhUZTM4Ni9XcVV1TnBKakREcUQzUHg1dnNEaTJY?= =?utf-8?B?OElXV001RC80ZkxZalZYck5qY3o5OUVEZTBFYXBjL3p0VkFjeDJoUHorR2oy?= =?utf-8?B?THowczZyTlBxOG5oT1QyL0RKOHNDejZaVW5OL1VMSGRndGVva3RtTk5pbEpl?= =?utf-8?B?WFNabFR0UmVTRUlBR00xR3FxMW0yMkJaOWo3NGR0Z0FrZG1adUZoTVdNeTBB?= =?utf-8?B?elVPVm51N2U1SHc1SVpQdlRWZlg5SWk0NTFhUjJUSitkYVJ2QlBXeGoybmlk?= =?utf-8?B?N3YzQS9IYXlkQlQ1VTNxWXhVQ1YzK2FGdExDZDNabWdIajUyQTlWeFdMNFBj?= =?utf-8?B?dStick9KMUZ5S1loTkRLYTNZQWtrdlR4eHhha1FrV1B1c0dhM0pMMndtQit0?= =?utf-8?B?dkQzM0pPamJDWnYxaFluQnQ5S1FCWGhGdlJJbnZ5Y0dvbUJ1Z09DMXN0TnE4?= =?utf-8?B?UHBCOFBRYmFqU2FKdk8rR3RDbGo2aXZpdDRRcGtGN3cwS25tY0dtcEV0Znpk?= =?utf-8?B?QzhoRWZzUVBlRWw0bzkxWnFlZWVieGRBeEkzVHdLSHhtOSthVG5yK0JPbDBG?= =?utf-8?B?RWVtc2g5Y3JwSVh5aGZ0OXFIblQ2TkpVZmpNT3RIOUoxSDBUQlNmT2dPME9R?= =?utf-8?B?T3pEYnEyc3Jqemd1ZEMveHFYUnNpZmZjSXVIQmtBWVZNMXJ3dmFyVzM0ajcr?= =?utf-8?Q?C3z1MRwfq8UKk2oSWDrYuOuC4=3D?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?REgvQ3I1YjRBOUtQekx3cFZYVDhxay80YjUyRjVlLzhvM24vdGVrQjE4TWtn?= =?utf-8?B?SGVxN1lHMlpWUVJxWmFTK0h5MmJNVGNrMCtLdDJseUM5dFViMFBiYUlRM0V5?= =?utf-8?B?bkswc2xqYXozUEwrbmlUT0ZJTXM1OTd3WGdoWVJaY3RIdjNvQm5VK2pMYlNW?= =?utf-8?B?cUxsVCszU3JPa0tWZjZxV2g4RW0zZWE4V1ljMzRlV3lXV1R1RWlNRDNCNk1y?= =?utf-8?B?T2lpeHpRdHh4TXNMNW0zNkVSN3k1bElVKzhSc2dZbUMrYlBGL3RVVUhOTEVK?= =?utf-8?B?UnJTK1BnMkZiV0gySGpjY2FVZUFaeEp3Wi9JZzhhNGwwYWcrOVFrbUladXht?= =?utf-8?B?WG5WcnJUdmFUTGVmMHlMbTdWOVQ5ZmJETllMK29mT01Zalhhem05dGppbkMw?= =?utf-8?B?TDNKREsxY1NGK1JoYWE1RzZlYnFYdGZPcDNycE4wcG1ITzRrWHRYdE51MzBB?= =?utf-8?B?N0kxSDhhQ1pVbnI3SC9CbjNERVp0STFjUmUxNnRxTk1yVEFoSGdvNENyZEl5?= =?utf-8?B?bFFFNWJJWC9HblZ1Y1dBbWZFRDdYYkhmZlMzWXZaaGs3ZzF4UmlYYVBRaW13?= =?utf-8?B?ZVhrZWRZOWRmT3haVW9MQXFSMWMxMDRPOTluejBka3kveWsvQkNRVE55ckJI?= =?utf-8?B?U3NEYWdvQk8rUUswOFZrMGwrQUE2a25BdVNOd0g3Ukc1b28rRW5Tc2M2dDk1?= =?utf-8?B?Nzgwczc0N1RRK3Z5RUxMYVBOQUp2dHVQRGpDUGJ1REYwUWsvcXBxN1BKOUhH?= =?utf-8?B?NXc0NldvVjROR20rN0NHYWFaK2ZONW45eWxQR0lMU3NTbmNyVVQxOUZQYnR1?= =?utf-8?B?ZkljZVRWaGhENURVRzZlQ3Q2Zjdqa2FJVlUzcDBvd01LNDA2b3ZxZVBuRTJ4?= =?utf-8?B?USt0UmtoNVByY3g5cTZmdTF5M2JTVzVaZkdjeGZ5ZDJKN2ltdndUMEhRYk5x?= =?utf-8?B?d2FkRE90VGp6Z2d5MUVFUWkrZDc1V2VXV1Zpcnp4Z3puaHdJaU5USmgvbWNt?= =?utf-8?B?VmFIeXkyTzRIbzJIbVk1MHF0a0NBajkwVUxoam9FYkQ2dUdGbTBWQXBOeWdQ?= =?utf-8?B?TVFGY0V6bTB1S1BEVXpZRWtDMHNDaVBOVHZUZStMeHpKRXNWSTNtK3ZyVTdR?= =?utf-8?B?Y1dYNUd4a1BCWTc3SGJDQThZRkJFVGN4NUJHV3h2dXNoWENJUHFXTXBvOStB?= =?utf-8?B?RERlbndQVzBIZWZ5R2g4RG5ZUG51TUE5aERpZ3FHcHAyR2V2cVJieWRxTmpy?= =?utf-8?B?V1hBTnBXNG02dTJVVEFFV3dndHQ4SDg3U05vRmd2cVdmMlk1VHpsRGE0Y25E?= =?utf-8?B?UGVmbnJSSTNJNEppZU5VeFhTUjFndVJFZHRzWk0xSVd3OE9iMGp3cHZsdlFy?= =?utf-8?B?Uk9vaXhpZ0xCakFSZjYzbzI0cFp4bnhqKzBVSTM1bEtSVzlmcjBkZkNmN084?= =?utf-8?B?NVJiMnlOYjJYcTA1cGVsRzN3OU9qY0hKSGozVXU5NWlUY1VQZmZqOGpFT2kr?= =?utf-8?B?NmlUTHM1TkZidTFhMnY0bkZrNEdmaDM5WGowcEVCUFk1VkczZHllT0xVbk9z?= =?utf-8?B?eGtBUzdrc0tmZU1sRFN2UTBkd2FrZVgyKzBLWTdMWFU1eSthMG5FcG96Si9q?= =?utf-8?B?bEhyZzl1Tm4zeVJCNXdnMXl0ekxhamQvNDVXVEtaSXgzSXkwTjVuQ01yV3lU?= =?utf-8?B?K0J4THRzaDVYUjFzMHlPY2pVYXVVbmsxdXg2VTFXb1RxUm5hK3hGdStHK3Y3?= =?utf-8?Q?m5hfpREY34sX9jvLgkNnCYRZAyQMfc2sec5yGkr?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9788ccaa-bd1b-41a7-6355-08dd8173a402 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 07:59:43.2695 (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: AM8P250MB0373 Subject: Re: [FFmpeg-devel] [PATCH v4 3/3] lavc/dxvenc: improve compatibility with Resolume products X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/GV1P250MB07376A4D09A031A34A8D108C8FBB2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> Emma Worley: > Improves compatibility with Resolume products by adding an additional > hashtable for DXT color+LUT combinations, and padding the DXT texture > dimensions to the next largest multiple of 16. Produces identical > packets to Resolume Alley in manual tests. > > Signed-off-by: Emma Worley <emma@emma.gg> > --- > libavcodec/dxvenc.c | 131 +++++++++++++++++++++++------------- > tests/ref/fate/dxv3enc-dxt1 | 2 +- > 2 files changed, 86 insertions(+), 47 deletions(-) > > diff --git a/libavcodec/dxvenc.c b/libavcodec/dxvenc.c > index 207ac1f24f..48548ae811 100644 > --- a/libavcodec/dxvenc.c > +++ b/libavcodec/dxvenc.c > @@ -34,6 +34,11 @@ > > #define DXV_HEADER_LENGTH 12 > > +/* > + * Resolume will refuse to display frames that are not padded to 16x16 pixels. > + */ > +#define DXV_ALIGN(x) FFALIGN(x, 16) > + > /* > * DXV uses LZ-like back-references to avoid copying words that have already > * appeared in the decompressed stream. Using a simple hash table (HT) > @@ -60,6 +65,7 @@ typedef struct DXVEncContext { > > struct FFHashtableContext *color_ht; > struct FFHashtableContext *lut_ht; > + struct FFHashtableContext *combo_ht; > } DXVEncContext; > > /* Converts an index offset value to a 2-bit opcode and pushes it to a stream. > @@ -94,10 +100,14 @@ static int dxv_compress_dxt1(AVCodecContext *avctx) > DXVEncContext *ctx = avctx->priv_data; > PutByteContext *pbc = &ctx->pbc; > void *value; > - uint32_t color, lut, idx, color_idx, lut_idx, prev_pos, state = 16, pos = 0, op = 0; > + uint64_t combo; > + uint32_t color, lut, idx, combo_idx, prev_pos, old_pos, state = 16, pos = 0, op = 0; > > ff_hashtable_clear(ctx->color_ht); > ff_hashtable_clear(ctx->lut_ht); > + ff_hashtable_clear(ctx->combo_ht); > + > + ff_hashtable_set(ctx->combo_ht, ctx->tex_data, &pos); > > bytestream2_put_le32(pbc, AV_RL32(ctx->tex_data)); > ff_hashtable_set(ctx->color_ht, ctx->tex_data, &pos); > @@ -107,51 +117,46 @@ static int dxv_compress_dxt1(AVCodecContext *avctx) > pos++; > > while (pos + 2 <= ctx->tex_size / 4) { > - idx = 0; > - color_idx = 0; > - lut_idx = 0; > + combo = AV_RL64(ctx->tex_data + pos * 4); > + combo_idx = ff_hashtable_get(ctx->combo_ht, &combo, &prev_pos) ? pos - prev_pos : 0; > + idx = combo_idx; > + PUSH_OP(2); > + if (pos >= LOOKBACK_WORDS) { > + old_pos = pos - LOOKBACK_WORDS; > + if (ff_hashtable_get(ctx->combo_ht, ctx->tex_data + old_pos * 4, &prev_pos) && prev_pos <= old_pos) > + ff_hashtable_delete(ctx->combo_ht, ctx->tex_data + old_pos * 4); > + } > + ff_hashtable_set(ctx->combo_ht, &combo, &pos); > > color = AV_RL32(ctx->tex_data + pos * 4); > - if (ff_hashtable_get(ctx->color_ht, &color, &prev_pos)) > - color_idx = pos - prev_pos; > - ff_hashtable_set(ctx->color_ht, &color, &pos); > - > + if (!combo_idx) { > + idx = ff_hashtable_get(ctx->color_ht, &color, &prev_pos) ? pos - prev_pos : 0; > + PUSH_OP(2); > + if (!idx) > + bytestream2_put_le32(pbc, color); > + } > if (pos >= LOOKBACK_WORDS) { > - uint32_t old_pos = pos - LOOKBACK_WORDS; > + old_pos = pos - LOOKBACK_WORDS; > if (ff_hashtable_get(ctx->color_ht, ctx->tex_data + old_pos * 4, &prev_pos) && prev_pos <= old_pos) > ff_hashtable_delete(ctx->color_ht, ctx->tex_data + old_pos * 4); > } > + ff_hashtable_set(ctx->color_ht, &color, &pos); > pos++; > > lut = AV_RL32(ctx->tex_data + pos * 4); > - if (color_idx && lut == AV_RL32(ctx->tex_data + (pos - color_idx) * 4)) { > - idx = color_idx; > - } else { > - idx = 0; > - if (ff_hashtable_get(ctx->lut_ht, &lut, &prev_pos)) > - lut_idx = pos - prev_pos; > - ff_hashtable_set(ctx->lut_ht, &lut, &pos); > + if (!combo_idx) { > + idx = ff_hashtable_get(ctx->lut_ht, &lut, &prev_pos) ? pos - prev_pos : 0; > + PUSH_OP(2); > + if (!idx) > + bytestream2_put_le32(pbc, lut); > } > if (pos >= LOOKBACK_WORDS) { > - uint32_t old_pos = pos - LOOKBACK_WORDS; > + old_pos = pos - LOOKBACK_WORDS; > if (ff_hashtable_get(ctx->lut_ht, ctx->tex_data + old_pos * 4, &prev_pos) && prev_pos <= old_pos) > ff_hashtable_delete(ctx->lut_ht, ctx->tex_data + old_pos * 4); > } > + ff_hashtable_set(ctx->lut_ht, &lut, &pos); > pos++; > - > - PUSH_OP(2); > - > - if (!idx) { > - idx = color_idx; > - PUSH_OP(2); > - if (!idx) > - bytestream2_put_le32(pbc, color); > - > - idx = lut_idx; > - PUSH_OP(2); > - if (!idx) > - bytestream2_put_le32(pbc, lut); > - } > } > > return 0; > @@ -172,12 +177,50 @@ static int dxv_encode(AVCodecContext *avctx, AVPacket *pkt, > return ret; > > if (ctx->enc.tex_funct) { > + uint8_t *safe_data[4] = {frame->data[0], 0, 0, 0}; > + int safe_linesize[4] = {frame->linesize[0], 0, 0, 0}; > + > + if (avctx->width != DXV_ALIGN(avctx->width) || avctx->height != DXV_ALIGN(avctx->height)) { > + ret = av_image_alloc( > + safe_data, > + safe_linesize, > + DXV_ALIGN(avctx->width), > + DXV_ALIGN(avctx->height), > + avctx->pix_fmt, > + 1); > + if (ret < 0) > + return ret; > + > + av_image_copy2( > + safe_data, > + safe_linesize, > + frame->data, > + frame->linesize, > + avctx->pix_fmt, > + avctx->width, > + avctx->height); > + > + if (avctx->width != DXV_ALIGN(avctx->width)) { > + for (int y = 0; y < avctx->height; y++) { > + memset(safe_data[0] + y * safe_linesize[0] + frame->linesize[0], 0, safe_linesize[0] - frame->linesize[0]); > + } > + } > + if (avctx->height != DXV_ALIGN(avctx->height)) { > + for (int y = avctx->height; y < DXV_ALIGN(avctx->height); y++) { > + memset(safe_data[0] + y * safe_linesize[0], 0, safe_linesize[0]); > + } > + } > + } Did you try to avoid the above by modifying ff_texturedsp_exec_compress_threads()? > + > ctx->enc.tex_data.out = ctx->tex_data; > - ctx->enc.frame_data.in = frame->data[0]; > - ctx->enc.stride = frame->linesize[0]; > - ctx->enc.width = avctx->width; > - ctx->enc.height = avctx->height; > + ctx->enc.frame_data.in = safe_data[0]; > + ctx->enc.stride = safe_linesize[0]; > + ctx->enc.width = DXV_ALIGN(avctx->width); > + ctx->enc.height = DXV_ALIGN(avctx->height); > ff_texturedsp_exec_compress_threads(avctx, &ctx->enc); > + > + if (safe_data[0] != frame->data[0]) > + av_freep(&safe_data[0]); > } else { > /* unimplemented: YCoCg formats */ > return AVERROR_INVALIDDATA; > @@ -216,14 +259,6 @@ 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) { > @@ -237,10 +272,10 @@ static av_cold int dxv_init(AVCodecContext *avctx) > return AVERROR_INVALIDDATA; > } > ctx->enc.raw_ratio = 16; > - ctx->tex_size = avctx->width / TEXTURE_BLOCK_W * > - avctx->height / TEXTURE_BLOCK_H * > + ctx->tex_size = DXV_ALIGN(avctx->width) / TEXTURE_BLOCK_W * > + DXV_ALIGN(avctx->height) / TEXTURE_BLOCK_H * > ctx->enc.tex_ratio; > - ctx->enc.slice_count = av_clip(avctx->thread_count, 1, avctx->height / TEXTURE_BLOCK_H); > + ctx->enc.slice_count = av_clip(avctx->thread_count, 1, DXV_ALIGN(avctx->height) / TEXTURE_BLOCK_H); > > ctx->tex_data = av_malloc(ctx->tex_size); > if (!ctx->tex_data) { > @@ -251,6 +286,9 @@ static av_cold int dxv_init(AVCodecContext *avctx) > if (ret < 0) > return ret; > ret = ff_hashtable_alloc(&ctx->lut_ht, sizeof(uint32_t), sizeof(uint32_t), LOOKBACK_HT_ELEMS); > + if (ret < 0) > + return ret; > + ret = ff_hashtable_alloc(&ctx->combo_ht, sizeof(uint64_t), sizeof(uint32_t), LOOKBACK_HT_ELEMS); > if (ret < 0) > return ret; > > @@ -265,6 +303,7 @@ static av_cold int dxv_close(AVCodecContext *avctx) > > ff_hashtable_freep(&ctx->color_ht); > ff_hashtable_freep(&ctx->lut_ht); > + ff_hashtable_freep(&ctx->combo_ht); > > return 0; > } > diff --git a/tests/ref/fate/dxv3enc-dxt1 b/tests/ref/fate/dxv3enc-dxt1 > index 74849a8031..e09000e181 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, 76521, 0xed387a5e > +0, 0, 0, 1, 76190, 0x0e6f0326 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".