From patchwork Tue Jul 12 10:27:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36757 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:6da0:b0:8b:e47:9dbf with SMTP id wl32csp1909228pzb; Tue, 12 Jul 2022 03:28:47 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s4NxaG17NrvU3izSIMe6/fTPbL5ZZ9Gaj7tA/BGisyKsO7sMUXaP+ipklN1myoCbNBL35H X-Received: by 2002:a17:906:5343:b0:722:ea54:fe67 with SMTP id j3-20020a170906534300b00722ea54fe67mr22930239ejo.181.1657621727540; Tue, 12 Jul 2022 03:28:47 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l1-20020a170906a40100b006f3b5fbc9easi11052268ejz.904.2022.07.12.03.28.45; Tue, 12 Jul 2022 03:28:47 -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; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=O+k1JvIj; 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 B7A9B68B8B2; Tue, 12 Jul 2022 13:28:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073026.outbound.protection.outlook.com [40.92.73.26]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3267468B88C for ; Tue, 12 Jul 2022 13:28:31 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FgBzZgqP1gR63fS97sChU3xbD23UhF+Rk//Jcxf8NvtgeaIOParwikHEKg42QszgWfSJuQTCrsO0hheXrhQAgSswOjtuJV0/mmyG02TYCNM8lh8GlAwtewwcSwcTLOK9x2FybvpcCctHHgIHGSIxfi3vDr1gB1hMsYMDAm7M0tjEk8vrfpCEWKHxY+aVunqZUG1dW4aZiMTbCqb4JD2P+graBK0RGMOZXkcLFtWreE5djKhDpKxy75I91pqY+933pAdK0/6zm5q7bI7dQzHVS/TMdg6MRUb60t+yLn4YMvgwyX/viASMUXTna/jN+99hLs9PcMIJyP86qg+2oTtJJA== 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=Hd3d89gU/bFyypKFgyCx9IZU3MU5UAIU+8MMpxmNAIE=; b=Zf+NQsqonRVfb5MEB4Swk704A4n9GqVtEPhQITU41QipqOm+h25XRiYzA5f0zlsVG8cadJnF+6G8XD1hXlqQwF0lKtxU5FXIJeMrj4EGxq8EBk4m724noDz1R8wfLc0eggjpLxwkZEwMrUyloX2i25Ka4If8GL3/XVbb3B5VazxgtEv5qcu4jWvMCG2afXYCP2Lo1dFSjzShZDRwetx/pKw3LAnXARaQ325xbEU/eBIW+XRmiC2bw898sjaRdhOfBJsgTkqdlp3SSqsfTxua7CC0OY6mOGkiqYZn6Rop2sprYN//lDetnDivwUIk8CTWNMHyYaLcFIayZ3pr+YsUUg== 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=Hd3d89gU/bFyypKFgyCx9IZU3MU5UAIU+8MMpxmNAIE=; b=O+k1JvIjYKk56z3g1lbUEP+JuBI8+x5XS4w49HX63Oz7HvpDObhgqZpA3ngvx/FLP7SzzP9mEEXJ26bSY1OmZqiIX/09XTMLH60THmP8U7YjJA2X8ThAbOkmOwUCpXWfFATkWNON8oQLgSs/It7IQfDZVX+BbYVXcMUjf2f4i9dujEwmyW7gOYsPDoZcBbPKCo4k8kItgMVb9Eadp1P2qmlHkbuANu4zQUgA+shhcht9bp6zYDrq5a2pbHG0Ow2LRS7fCjsepxOg2eZVt03NrwS9az5TO7hqNsUJScgmxC8DmG7P6sT0eKjkdfYyNcxzPZuEXDhiv1lp65WrGGp61A== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by VI1PR01MB4814.eurprd01.prod.exchangelabs.com (2603:10a6:803:92::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.25; Tue, 12 Jul 2022 10:28:25 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5417.026; Tue, 12 Jul 2022 10:28:25 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 12 Jul 2022 12:27:49 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [XQLPmu4ALXDkI0QzwpBwk5UMZeJiV2cy] X-ClientProxiedBy: AS9PR07CA0048.eurprd07.prod.outlook.com (2603:10a6:20b:46b::15) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220712102751.3784996-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7f8863bf-6608-4ac4-da0d-08da63f140ad X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiRJ0BC0M7R52QM1cuRSG6d3Jo/1Updn9AIgnJMxxGVdr/UA1RacJs5hvPxxk+rtvmkYOmEbnuuqcpMP+LphO4vooe6Y74lbrPSdqnz+O9sOVimzcZ26wdUTSRHwRFNCCq/Wha5EmWHjA0inuTPV5d2hmkOUIJDLZgw8dS3mULWSPFHieSUe6DyXTJ5sXzNbCCZgFQLyJAnp9oJhThF4Stce9yiomrliTmiiw2TDMc+HsRWw5qZKp/Zp9wLF/91t0TUc8NBs/2UDXbqeddVXsHanQDNvMewmijrE+YXBeKCHSb41Yi8eGSpMEIfZSv7pQ2/psicx071CnquZn9crhBhov2Y+N4nMd8CMb+D3GRoZfitjwZ7QU22gqaOrtdycXEJCrnWaHDsRmRBiKYwQZ0vIRzbnghZMg6rANJiwAm4ZauGqFGZ/HcNkS3DKUK7Os6/qgwVlkinLBsY6pQSzK9dCLBBSms+PkPUDoCLM/ZJ/2/c49b8hGQbglaZRQIE7oN/W8fsRukVtZHKq8Al3f7pg43X5NsWj5UWLDNR8dCPRAInxyEZqe+IcgKNaRpcR1JvLOqvVHXnN0TqlBg7aERNtByyhFoLOxmvbS7++nYaBsHpoXWdh13HI+MOY9hMs/ZCGAjYnWkq/VBHEJILr6WMCGq6POMoyvd5/B+singJ4q4XW08Eq6aopGXA7UYl34zdvq3C69BHcu9rxgVXEKUG38LXFeaaRjnzmYXKT7Y4EKgoZmB6JTw6CSPdYsYD7s5E= X-MS-TrafficTypeDiagnostic: VI1PR01MB4814:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YwgrTh58M8p/aJ5MTC8cvlQ2e7+GK11zkv4dRpve+zy725XAfxA70hlYp2cibKSXzJUAg2ruLtD/RdV9AAYpS3GBTGCkB8mPIz+ohxXaHwvw99HUUDhsW3SF3KbNInq/d2gQqwl2rxxB5zkC5brWUFF6lKxGXXqfoCsH4ROYCK7Hh3f5xh11u4IHfuubo6cT/pS+Hj8vGBRiuQ/z8+UtaEFYa84si05Nskx+nfD68SbwJJDRsRobcBchHmADty7+joXnUBh18BYtcqsz4JDfl2f+s4QWcRsFAGgf8js29Jy5ABH0oHZUX2kE0KhYEQOyJmuoY5tjb0F3JBNMeYFE+Ja4VQbbeEeF8Ef9jpcHyO/nVDJz8JB7teupHfhXI62bTK7czc/VP/mo48YE5FM92h8CZWsoqr9Crpk8KBjjM0e0vsApeGkeZWixtvPWMT9d94Und7mhTifPV3WgaL9IC/HwVjbP1QkadQLzt8c8M6T1DE1G61i05hEZnAOnGiTB4qII6Ps/eGAx+jFpFYNiVEc+RegKx3z/270H0NBDqAvToPQiheUC6Y3S5/81ch8X9HxtPFFzbLrPEl2e+1CQFaGZPt2LjGOc7z1FhlM6BLJJRsbqj4ej/nQXQJfECbEXGW6q+bjUbu1ufPSe3xVo/mKlVrLKsNEBJUHSo60oVRSydqZoUNeKfHRlXLuWje4dM0Ssvrigw9roRuC5IoofkQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Rp1aUllgUSKjSjRG0XeLcCDVJJPNElp2B4B2CYsH1dTXypx2StQsfwMQfgcvyCIRSskusuGZ6IrT6neVw0TDF8uMKgS2UsX8eD+0H5wU8y8Qj/xZeoLv3nkYJFIYx4dGZSfmiry74DNwtlSz/zhNGeQkqCyYBw4m+BD+dq6alwHRGqy0cgEA3TVdiHmPEhshylhgw1SLALltKvWiTlTgWxNDmH3531lbnZ4sgbxg2WdD3+djPN/1uF00bfnHUKRAZ2DgEVVHGWQ7stEbSMCkSJNSwU6UAksQlY1RgQG/zL30O5ay1PJlSqz3bIVo8zMiW1+hX6BUuEcThjgYmGRxGBJOLGWVPlcsj7E9T8wg5leoudUzPDUqTs7NAyxHgu07AqX+Hf6OBuskQxCRDGcMuCWg3+2OUZP+K52O/meNK7T8+sZvvifHzHwBPwUt/0GxCsYYFLTz6GpG/KXud0Iw9foJ2M02bMXz632774hVYqSeLTmfYtZCV+z/wBtDFvCmMWHYGx4jXFZmWFSiGGi+k0MC1Rs7Nwb/Uufq8WvVxLWgL8Hw7q0jczO/Z+862JO4EPYsPAPiywtFQYzC1EqBaXHSsQvOX5RZCAjbEsLW4T+44ka4yD8+83+f2GLoLcp2iBDf7pNgeH1gHJbgOmsBvOf9ApshFEGVOpISOVMaIldhBIOUJZ/RWxykaSUZ7qkxNlmaO0Mbabg9QBLyXpQuVyi3x4UJxgq+rVp5gfqzVZfxqeH+vMtHITn0lXT2pfJ5u2ZP4IQ/sAD1OJi9kUarC/lbXDodVV8ZiwieobSl4jLbOufbZYK+1QqZ1p257wY3bXbc3msbfZolEqKzhy45lzY9GCyJQ/bPeYjvVnW94XhPBkCXP1VeMHnNVlSroVAlnZ2nF4ePgmUvMJgFmnV840xaCIWNBXF0apHDEPCzj2JLEtdNQczVIHksc8hrFRAfk02Ns0l5OEghves9lVrsmajms2VJjBInyyKkz0LKCSU4Qj5/GSqRw5cagt/jkiM07xqaCSppcstS62c2gZf6mFDLlDrzFGqlbFAdzyZzqsqpnEC74CuuM1RlC25BfdKKTdlqAHkqpHuA4IhSLE8KC50EgnkLSSjBgGvjUrX8io+iCEcR/SL9xBBu+AjrKptvAsLv0b5HfJMNiSfN2X33C6c9cliWp3++BI9jw0z1DGa+p5pxojYLAnnEggXzQAtRlxq/PBZe/Pr94vLP3MsN0lHg1njBRI6P3Cgdw4ef2cH+XvUPMcpfIYJ/Kvc1uVJvI2X6XXD1/+dDBd8YXVq3WCemToQ1PT+JpswI+jQ7dtU= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7f8863bf-6608-4ac4-da0d-08da63f140ad X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jul 2022 10:28:25.2874 (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: VI1PR01MB4814 Subject: [FFmpeg-devel] [PATCH 5/7] avcodec/iff: Reindent after the previous commits 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: /tLpySgmguCK Signed-off-by: Andreas Rheinhardt --- libavcodec/iff.c | 260 +++++++++++++++++++++++------------------------ 1 file changed, 128 insertions(+), 132 deletions(-) diff --git a/libavcodec/iff.c b/libavcodec/iff.c index 453e910982..00d0105be3 100644 --- a/libavcodec/iff.c +++ b/libavcodec/iff.c @@ -207,7 +207,7 @@ static int extract_header(AVCodecContext *const avctx, IffContext *s = avctx->priv_data; const uint8_t *buf = extradata; unsigned buf_size = 0; - int i, palette_size; + int palette_size; if (extradata_size < 2) { av_log(avctx, AV_LOG_ERROR, "not enough extradata\n"); @@ -215,109 +215,109 @@ static int extract_header(AVCodecContext *const avctx, } palette_size = extradata_size - AV_RB16(extradata); - buf_size = bytestream_get_be16(&buf); - if (buf_size <= 1 || palette_size < 0) { - av_log(avctx, AV_LOG_ERROR, - "Invalid palette size received: %u -> palette data offset: %d\n", - buf_size, palette_size); - return AVERROR_INVALIDDATA; - } + buf_size = bytestream_get_be16(&buf); + if (buf_size <= 1 || palette_size < 0) { + av_log(avctx, AV_LOG_ERROR, + "Invalid palette size received: %u -> palette data offset: %d\n", + buf_size, palette_size); + return AVERROR_INVALIDDATA; + } if (buf_size < 41) return 0; - s->compression = bytestream_get_byte(&buf); - s->bpp = bytestream_get_byte(&buf); - s->ham = bytestream_get_byte(&buf); - s->flags = bytestream_get_byte(&buf); - s->transparency = bytestream_get_be16(&buf); - s->masking = bytestream_get_byte(&buf); - for (i = 0; i < 16; i++) - s->tvdc[i] = bytestream_get_be16(&buf); - - if (s->ham) { - if (s->bpp > 8) { - av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham); - return AVERROR_INVALIDDATA; - } else if (s->ham != (s->bpp > 6 ? 6 : 4)) { - av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u, BPP: %u\n", s->ham, s->bpp); - return AVERROR_INVALIDDATA; - } + s->compression = bytestream_get_byte(&buf); + s->bpp = bytestream_get_byte(&buf); + s->ham = bytestream_get_byte(&buf); + s->flags = bytestream_get_byte(&buf); + s->transparency = bytestream_get_be16(&buf); + s->masking = bytestream_get_byte(&buf); + for (int i = 0; i < 16; i++) + s->tvdc[i] = bytestream_get_be16(&buf); + + if (s->ham) { + if (s->bpp > 8) { + av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham); + return AVERROR_INVALIDDATA; + } else if (s->ham != (s->bpp > 6 ? 6 : 4)) { + av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u, BPP: %u\n", s->ham, s->bpp); + return AVERROR_INVALIDDATA; } + } - if (s->masking == MASK_HAS_MASK) { - if (s->bpp >= 8 && !s->ham) { - avctx->pix_fmt = AV_PIX_FMT_RGB32; - if (s->bpp > 16) { - av_log(avctx, AV_LOG_ERROR, "bpp %d too large for palette\n", s->bpp); - return AVERROR(ENOMEM); - } - s->mask_buf = av_malloc((s->planesize * 32) + AV_INPUT_BUFFER_PADDING_SIZE); - if (!s->mask_buf) - return AVERROR(ENOMEM); - s->mask_palbuf = av_malloc((2 << s->bpp) * sizeof(uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE); - if (!s->mask_palbuf) - return AVERROR(ENOMEM); + if (s->masking == MASK_HAS_MASK) { + if (s->bpp >= 8 && !s->ham) { + avctx->pix_fmt = AV_PIX_FMT_RGB32; + if (s->bpp > 16) { + av_log(avctx, AV_LOG_ERROR, "bpp %d too large for palette\n", s->bpp); + return AVERROR(ENOMEM); } - s->bpp++; - } else if (s->masking != MASK_NONE && s->masking != MASK_HAS_TRANSPARENT_COLOR) { - av_log(avctx, AV_LOG_ERROR, "Masking not supported\n"); - return AVERROR_PATCHWELCOME; - } - if (!s->bpp || s->bpp > 32) { - av_log(avctx, AV_LOG_ERROR, "Invalid number of bitplanes: %u\n", s->bpp); - return AVERROR_INVALIDDATA; + s->mask_buf = av_malloc((s->planesize * 32) + AV_INPUT_BUFFER_PADDING_SIZE); + if (!s->mask_buf) + return AVERROR(ENOMEM); + s->mask_palbuf = av_malloc((2 << s->bpp) * sizeof(uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE); + if (!s->mask_palbuf) + return AVERROR(ENOMEM); } - if (s->video_size && s->planesize * s->bpp * avctx->height > s->video_size) - return AVERROR_INVALIDDATA; + s->bpp++; + } else if (s->masking != MASK_NONE && s->masking != MASK_HAS_TRANSPARENT_COLOR) { + av_log(avctx, AV_LOG_ERROR, "Masking not supported\n"); + return AVERROR_PATCHWELCOME; + } + if (!s->bpp || s->bpp > 32) { + av_log(avctx, AV_LOG_ERROR, "Invalid number of bitplanes: %u\n", s->bpp); + return AVERROR_INVALIDDATA; + } + if (s->video_size && s->planesize * s->bpp * avctx->height > s->video_size) + return AVERROR_INVALIDDATA; - if (s->ham) { - int i, count = FFMIN(palette_size / 3, 1 << s->ham); - int ham_count; - const uint8_t *const palette = extradata + AV_RB16(extradata); - int extra_space = 1; + if (s->ham) { + int count = FFMIN(palette_size / 3, 1 << s->ham); + int ham_count; + const uint8_t *const palette = extradata + AV_RB16(extradata); + int extra_space = 1; - if (avctx->codec_tag == MKTAG('P', 'B', 'M', ' ') && s->ham == 4) - extra_space = 4; + if (avctx->codec_tag == MKTAG('P', 'B', 'M', ' ') && s->ham == 4) + extra_space = 4; - s->ham_buf = av_malloc((s->planesize * 8) + AV_INPUT_BUFFER_PADDING_SIZE); - if (!s->ham_buf) - return AVERROR(ENOMEM); + s->ham_buf = av_malloc((s->planesize * 8) + AV_INPUT_BUFFER_PADDING_SIZE); + if (!s->ham_buf) + return AVERROR(ENOMEM); - ham_count = 8 * (1 << s->ham); - s->ham_palbuf = av_malloc(extra_space * (ham_count << !!(s->masking == MASK_HAS_MASK)) * sizeof (uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE); - if (!s->ham_palbuf) - return AVERROR(ENOMEM); + ham_count = 8 * (1 << s->ham); + s->ham_palbuf = av_malloc(extra_space * (ham_count << !!(s->masking == MASK_HAS_MASK)) * sizeof (uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE); + if (!s->ham_palbuf) + return AVERROR(ENOMEM); - if (count) { // HAM with color palette attached - // prefill with black and palette and set HAM take direct value mask to zero - memset(s->ham_palbuf, 0, (1 << s->ham) * 2 * sizeof (uint32_t)); - for (i=0; i < count; i++) { - s->ham_palbuf[i*2+1] = 0xFF000000 | AV_RL24(palette + i*3); - } - count = 1 << s->ham; - } else { // HAM with grayscale color palette - count = 1 << s->ham; - for (i=0; i < count; i++) { - s->ham_palbuf[i*2] = 0xFF000000; // take direct color value from palette - s->ham_palbuf[i*2+1] = 0xFF000000 | av_le2ne32(gray2rgb((i * 255) >> s->ham)); - } - } - for (i=0; i < count; i++) { - uint32_t tmp = i << (8 - s->ham); - tmp |= tmp >> s->ham; - s->ham_palbuf[(i+count)*2] = 0xFF00FFFF; // just modify blue color component - s->ham_palbuf[(i+count*2)*2] = 0xFFFFFF00; // just modify red color component - s->ham_palbuf[(i+count*3)*2] = 0xFFFF00FF; // just modify green color component - s->ham_palbuf[(i+count)*2+1] = 0xFF000000 | tmp << 16; - s->ham_palbuf[(i+count*2)*2+1] = 0xFF000000 | tmp; - s->ham_palbuf[(i+count*3)*2+1] = 0xFF000000 | tmp << 8; + if (count) { // HAM with color palette attached + // prefill with black and palette and set HAM take direct value mask to zero + memset(s->ham_palbuf, 0, (1 << s->ham) * 2 * sizeof (uint32_t)); + for (int i = 0; i < count; i++) { + s->ham_palbuf[i*2+1] = 0xFF000000 | AV_RL24(palette + i*3); } - if (s->masking == MASK_HAS_MASK) { - for (i = 0; i < ham_count; i++) - s->ham_palbuf[(1 << s->bpp) + i] = s->ham_palbuf[i] | 0xFF000000; + count = 1 << s->ham; + } else { // HAM with grayscale color palette + count = 1 << s->ham; + for (int i = 0; i < count; i++) { + s->ham_palbuf[i*2] = 0xFF000000; // take direct color value from palette + s->ham_palbuf[i*2+1] = 0xFF000000 | av_le2ne32(gray2rgb((i * 255) >> s->ham)); } } + for (int i = 0; i < count; i++) { + uint32_t tmp = i << (8 - s->ham); + tmp |= tmp >> s->ham; + s->ham_palbuf[(i+count)*2] = 0xFF00FFFF; // just modify blue color component + s->ham_palbuf[(i+count*2)*2] = 0xFFFFFF00; // just modify red color component + s->ham_palbuf[(i+count*3)*2] = 0xFFFF00FF; // just modify green color component + s->ham_palbuf[(i+count)*2+1] = 0xFF000000 | tmp << 16; + s->ham_palbuf[(i+count*2)*2+1] = 0xFF000000 | tmp; + s->ham_palbuf[(i+count*3)*2+1] = 0xFF000000 | tmp << 8; + } + if (s->masking == MASK_HAS_MASK) { + for (int i = 0; i < ham_count; i++) + s->ham_palbuf[(1 << s->bpp) + i] = s->ham_palbuf[i] | 0xFF000000; + } + } return 0; } @@ -1470,57 +1470,53 @@ static int parse_packet_header(AVCodecContext *const avctx, GetByteContext *gb) { IffContext *s = avctx->priv_data; - int i; - - uint32_t chunk_id; - uint64_t data_size; if (avctx->codec_tag != MKTAG('A', 'N', 'I', 'M')) return 0; - bytestream2_skip(gb, 4); - while (bytestream2_get_bytes_left(gb) >= 1) { - chunk_id = bytestream2_get_le32(gb); - data_size = bytestream2_get_be32(gb); - - if (chunk_id == MKTAG('B', 'M', 'H', 'D')) { - bytestream2_skip(gb, data_size + (data_size & 1)); - } else if (chunk_id == MKTAG('A', 'N', 'H', 'D')) { - unsigned extra; - if (data_size < 40) - return AVERROR_INVALIDDATA; - - s->compression = (bytestream2_get_byte(gb) << 8) | (s->compression & 0xFF); - bytestream2_skip(gb, 19); - extra = bytestream2_get_be32(gb); - s->is_short = !(extra & 1); - s->is_brush = extra == 2; - s->is_interlaced = !!(extra & 0x40); - data_size -= 24; - bytestream2_skip(gb, data_size + (data_size & 1)); - } else if (chunk_id == MKTAG('D', 'L', 'T', 'A') || - chunk_id == MKTAG('B', 'O', 'D', 'Y')) { - if (chunk_id == MKTAG('B','O','D','Y')) - s->compression &= 0xFF; - break; - } else if (chunk_id == MKTAG('C', 'M', 'A', 'P')) { - int count = data_size / 3; - uint32_t *pal = s->pal; - - if (count > 256) - return AVERROR_INVALIDDATA; - if (s->ham) { - for (i = 0; i < count; i++) - pal[i] = 0xFF000000 | bytestream2_get_le24(gb); - } else { - for (i = 0; i < count; i++) - pal[i] = 0xFF000000 | bytestream2_get_be24(gb); - } - bytestream2_skip(gb, data_size & 1); + bytestream2_skip(gb, 4); + while (bytestream2_get_bytes_left(gb) >= 1) { + uint32_t chunk_id = bytestream2_get_le32(gb); + uint64_t data_size = bytestream2_get_be32(gb); + + if (chunk_id == MKTAG('B', 'M', 'H', 'D')) { + bytestream2_skip(gb, data_size + (data_size & 1)); + } else if (chunk_id == MKTAG('A', 'N', 'H', 'D')) { + unsigned extra; + if (data_size < 40) + return AVERROR_INVALIDDATA; + + s->compression = (bytestream2_get_byte(gb) << 8) | (s->compression & 0xFF); + bytestream2_skip(gb, 19); + extra = bytestream2_get_be32(gb); + s->is_short = !(extra & 1); + s->is_brush = extra == 2; + s->is_interlaced = !!(extra & 0x40); + data_size -= 24; + bytestream2_skip(gb, data_size + (data_size & 1)); + } else if (chunk_id == MKTAG('D', 'L', 'T', 'A') || + chunk_id == MKTAG('B', 'O', 'D', 'Y')) { + if (chunk_id == MKTAG('B','O','D','Y')) + s->compression &= 0xFF; + break; + } else if (chunk_id == MKTAG('C', 'M', 'A', 'P')) { + int count = data_size / 3; + uint32_t *pal = s->pal; + + if (count > 256) + return AVERROR_INVALIDDATA; + if (s->ham) { + for (int i = 0; i < count; i++) + pal[i] = 0xFF000000 | bytestream2_get_le24(gb); } else { - bytestream2_skip(gb, data_size + (data_size&1)); + for (int i = 0; i < count; i++) + pal[i] = 0xFF000000 | bytestream2_get_be24(gb); } + bytestream2_skip(gb, data_size & 1); + } else { + bytestream2_skip(gb, data_size + (data_size&1)); } + } return 0; }