From patchwork Tue Jul 12 10:26:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36753 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:6da0:b0:8b:e47:9dbf with SMTP id wl32csp1908209pzb; Tue, 12 Jul 2022 03:26:51 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sGuZjaSxQcQMPiibAqj6TGlRfyHpyT5B4pj7A046tPJcXYzK0STEVMGmYz3jIKE9ictkDk X-Received: by 2002:a17:906:58c8:b0:6fe:91d5:18d2 with SMTP id e8-20020a17090658c800b006fe91d518d2mr23290674ejs.190.1657621611702; Tue, 12 Jul 2022 03:26:51 -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 c9-20020a05640227c900b0043ad1f13cd3si2097595ede.509.2022.07.12.03.26.51; Tue, 12 Jul 2022 03:26:51 -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=GfPKz1Nm; 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 780A568B845; Tue, 12 Jul 2022 13:26:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-oln040092068032.outbound.protection.outlook.com [40.92.68.32]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1467368B5D6 for ; Tue, 12 Jul 2022 13:26:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bLSGwlpeczTmDRmxL0jbcchsccMN9xUHdmmO+iMi1k2Up4+wtYSxOFvoGeOneYB1eC9sp1B2lME3P0jriMYiBniwXv3V+bAk2WPpxSv8A9K/2dsenKw+ejLXzyOuZ8+orAgh7BP1uQ3GwyE2st0BeIR/y9Iinx6VTExQwegSoxR4519MhUXXDOQbQCu4pV/SpLfBh/s5ED2V1Fu8VDt7PDHDhBD7lNeNm69vuTYesI//6koJbh3f8kiwgia09L15KMo6fzDazgZ3qV3VrtrHHMlXF2l3F6MYYVfY6TS9ewP93CipqtKoI66Lk9DECOVMhkrNjReeRLapfbNC5YFy3A== 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=2FYSrrmVWDwZO758UH5c/SxM0rM1PATUk6ROfQEYUpY=; b=W9QQ7pK04uZ+5sRosp1TaM5kwF1zZNfkEHHFzxtgjl064n9Q4+00q7bFOslBZSnQKm7g30GU3W4tfknpUxV9xujOSuBMwzUP5lNf3q3JFewY5Vj02S3VSxiwL9JdH6OC+R1+WpQpGwWvpmmo+yP4j65EVYxb4TIZw6khcX0JdKdO/Fy9/Tni8W+D57lT7xgteJN1fbjPQJ0RnQA0nP+No5X8DsPcUHzEQd10tNP4KD6ty00z07MumRRcCOsdQrcKP9gaSu7qzph/rDAO3NcuUsNKtoTQihg0659WVzbtYsx4OmuomxsDMloYgpjQp6+vLm1Bihe6CnNSigNySHSEDw== 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=2FYSrrmVWDwZO758UH5c/SxM0rM1PATUk6ROfQEYUpY=; b=GfPKz1Nmd5IqeytwoYbHUs9R0RctNBqtsoKEQJ6ElIWwewf7kfnYFtOxmP5Ay0eFlS3l4pC2ii89NXKUoKmiYBRoL8CL7fKYaB3ucAiTJwONBelSPkm/oJNJBMFGVNReoyGFKd+gfncAUuyffv/zQacqxl3Db3g43zFmDDGNrDhTWebOMulNzjVZ6tu5YM+Fb+Weun7doKPF10Mkb1hOHTtwVFIeDx9uxUsSLOYFtVYTK2UiKZWZRDWIBwhz1/HUYTKcVTkmr1l0cvRcDTtqQw+GesD1wuxcyiGGKnhKyziQAbtl+IZlsJC4aZ4M+nnXzpQ3USC0m4hrnpxNOKzteQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by AS4PR01MB9934.eurprd01.prod.exchangelabs.com (2603:10a6:20b:4f4::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.26; Tue, 12 Jul 2022 10:26:40 +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:26:40 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 12 Jul 2022 12:26:26 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [6aZJgCkZk0sFxP77P84ZtJytLUvo/A+G] X-ClientProxiedBy: AS9PR06CA0001.eurprd06.prod.outlook.com (2603:10a6:20b:462::31) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220712102632.3784948-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 36ae413b-9199-4226-3d42-08da63f10219 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiRJ0BC0M7R52QM1cuRSG6d3XwLLRFo71pXn1sLJdSEG3OIvsdL7CiFQTI3Z4TdKMrxkAL3DIMAgErFfRyLWo5SwVkgDzJFpCBni/m0AD2brapI+xPhjBrudBbp7yLmNOmK1AzuWmfLnGsGt1TbbbM76LlCpdob02XfYPCTK8DzmfPPGBhtcPzePWiVq7mTymOr1QuhjiR1E7E9M72xFftH/nV0PcFZjgozjgAMZYybyENpyXxZLIhPhrgdjNowP3e+QKknbm02ncxN7sEEcxmcX1w8esgB0DzaI+9CsC7M7Oz3piZ74lYbxDslJK/GgIUJH+UwoWKjNdmkQnt3fqJgn0FTd3UN9CO9nCk6nzogkxEXN1rlWsIcIrxrIWLyzzcyaiZHran2iSKOgU6M/kfz8b6I8lOX9RHClxU/lHeQG6dO7JSJAm3VwZ5Ks6TOXbTjyPjadUT9DZT2FZmvQAE0u2y8PuQTKZ6aXbwag4arw5mckO4t3acJIvyX6iwOfL1sYGMO+zs2n3r/VY/I95zaXGq0d/zUVd0wr1ZFr2LkBzK4a8aKXujfcC45+8cRlptsAAMiLetpHSNrbOzqpcHLDXbodjzlLLWVXHwULv4Wy0VOMwWyYm32Xqcaj1YYSlc/xftC09+vvkyRWA7hIDyXeLSDj0xusZEQYivOZqhXm+I+6smqhbqNuoHDmgnAtvDQ9RvdyA9zWJ64CSFkyJEbgQ6RWK4t7cNrgrftoYZBW574MToL2xHqcNQYkRhX92x4= X-MS-TrafficTypeDiagnostic: AS4PR01MB9934:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: JYv2I2ZQz7stgt53gCaSIwGg+xeKEVSfNBcjNoIYa2zD8bQNIFJDwQY2RUmZjs+dkQXzJkEq+YcpfOux00uIUqH5ifqaGMoWlsl0jyQHUO2uoIjZbETM69tnNp7srEXom3Qct4uQa6sAkxYsRpIfntALomnuSfZcUa+ylNSYSWAhDKfJWyWz9kEut67x199BFAvXSlBFE6Yo1dlGbFRSD8iwYnYbb+5M1Cu5Dhjhy5C5sIDSVnyexIe9GSsvfIzM2GJoo40eDqAHInLbLLeeQUOCb6zJf2hYS1Vcmp/bZNLwDG1PqnVgcksSZBtGGC7/YsH0vuhtkrYTUtfV53dCSjSeTB7LeP4tfFg2UbwojarH8GHxS4JQhpwgvVrM4sOhO17VAz9+gQpPSONadxuPqY1uErib8tHBTgAr9QVVgQSljfqvphWFBv5XRuN3akI75ED7dVCh/20raU+7DKgmJRimq3JlK2Jfnnr0Eh2SP7Y73xqHaqOitvFtJImNy3J+aWen3OO+oMc9xHG8uF7Rw7wdpUEcILlKkF57Dx1uT74DmCaV3N4Pj4sqA0rBde466M1TuhMIovUASDp7eCs+MkiGLhWQjRvPy/lcFC0/unS9r3ozne4EQg2g+wXnF+H9SK6mymbn55LRvxWOR6i4kUlvZp0JOpgwjBL99cdOMqj6WxumtLF7TeS62CzKO5pwcxJ+ehtzl6E5nXM5uOo7EQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hCEAgBOGJe55W7avL1hrVzzfp0PrqVLux+VeWKTgAEjtIGV0I73J1zEsA79xCiNhgUxCf4r5124pl+Eh0+DncgP0xtgB7MDYrfepHTMVNbQ5ZpGMguEcm/D2hqUM9Urgsatd6ejrJ5hCeSneiWGQ96zTkVBfICSwvZ4abvf5eE20O2cplEAfDPhsjOvbORDzC7zbOreQDic8mwxR5K8MHeeo5ABPso6KeE5K2E4yDypcnq9/RhuGmNEbTHr54KVru82ZR+GO8A7eiE7UZQLOAZEuyS+hWj8mkQwGI0GqegRR5w6BQvFlT2lKIVberZZuTYaVLvsW/34A79HQEXaThBRsZM7dd8dYL5oPI7PFc0rvWfKR6vLqe40gIW388mGlFxMAPL6E6tJUKuMWZUK0D5QW6M+MRQ6c0QTVmZpSHpaZcBa3UJe+/CSCEBzm9c2jbSKyqbBc3qOpaTN+AKBaSNL41Co0T86D2Fjh/XjJK0jLKYDqyDaj3Kws5MOaL/8Xw5kN8GoFW0FNpeZl/c+FwpNsH1pMdXptcLeDXo7EstXg4pIWCD48eykticbM9taL7Zup7BpIMBd9XhklBakKFeZy2nzF9UrNoU/JStmDLwbz8uzPW8VnKblDaLNTaeyRzN3UXEwTUnOl4FLNc4gfwyYeP8wH9IKKd7QKyQ7SgO+0I/EdLJZfpvzuoXiCizTQzyzHE+ksZmlhi56tXKDsMT8EwmSINzn6t5hLu2isQCrwdsXKglx9wlTXeRjQYR1sxQmoRvKFeQk24CvvLHo5oawMHLn3N/mm7FosYoVZtSLPhznzSbrSk1fEMvfkvwEUBXXwEbwhBf9kp/9/3ryN78r1Rd80HF8AS3W7ZDNB0OxLAo8yxoWLSHA9kBbtkmDD3oXK3FktqJHO+6F76C/TX6hiU+/WQnseN6gYidBIoVflHJvSjGC4nc8EXGQGEBWiHhtJ0iXumEXB/8AHl2KIaP50ht/G/4qTZibKhbF/MrpH17/vFaI5AjTmdSGD8BmKgr3C570tcHFB0cEKWLhgWHCeCxjSunb3NbMB6LiNdI2CKwspRvU6CYisMioWwejIuFiHIm1PVZna/ImV8/Mdsp4Fq4C9fw6eLgCHUMoTTfjHUnFC69EOGgqh9Ms71FkbsFmAyrl6NkLxRYjIPGlK5moIc6jJ34rzop3gi5yhh7fdalFAWh/a0Hh4BlF/YlXbp5yGuHrHt2bfvPZoekQy9mk6/x2lL8+nGxhLvGw7li/cOIYVo6UYetIoWSlG9SXQQakewoIHPhFJaW5vAZle/b4yo2g42WIsAOAXaUzMAoU= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 36ae413b-9199-4226-3d42-08da63f10219 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:26:40.3416 (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: AS4PR01MB9934 Subject: [FFmpeg-devel] [PATCH 1/7] avcodec/iff: Split extract_header into extradata and packet part 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: LdyNCB1YXJnl 183132872a1d8bc8a32e7fd8f994fa2f1b2d6bfc made the iff demuxer output extradata and made the decoder parse said extradata. To make this extradata extensible, it came with its own internal length field (containing the offset of the palette at the end of the extradata). Furthermore, in order to support mid-stream extradata changes, the packets returned by the demuxer also have such a length field (containing the offset of the actual packet data). Therefore the packet parsing the extradata accepted its input from both AVPackets as well as from ordinary extradata. Yet the demuxer never made use of this "feature": The packet's length field always indicated that the packet data starts immediately after the length field. Later, commit cb928fc448f9566e6f6c28d53fa4c2388e732a2b stopped appending the length field to the packets' data; of course, it also stopped searching for extradata in this data. Instead it added code to parse the packet's header to the function that parses extradata. This made this function consist of two disjoint parts, one of which is only reachable if this function is called from init (when parsing extradata) and one of which is reachable when parsing packet headers. Therefore this commit splits this function into two. Signed-off-by: Andreas Rheinhardt --- Btw: Both of these commits broke API/ABI. libavcodec/iff.c | 116 +++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/libavcodec/iff.c b/libavcodec/iff.c index 74ebddc621..4abbed8dfb 100644 --- a/libavcodec/iff.c +++ b/libavcodec/iff.c @@ -199,11 +199,9 @@ static int cmap_read_palette(AVCodecContext *avctx, uint32_t *pal) * decoder structures. * * @param avctx the AVCodecContext where to extract extra context to - * @param avpkt the AVPacket to extract extra context from or NULL to use avctx * @return >= 0 in case of success, a negative error code otherwise */ -static int extract_header(AVCodecContext *const avctx, - const AVPacket *const avpkt) +static int extract_header(AVCodecContext *const avctx) { IffContext *s = avctx->priv_data; const uint8_t *buf; @@ -216,55 +214,6 @@ static int extract_header(AVCodecContext *const avctx, } palette_size = avctx->extradata_size - AV_RB16(avctx->extradata); - if (avpkt && avctx->codec_tag == MKTAG('A', 'N', 'I', 'M')) { - uint32_t chunk_id; - uint64_t data_size; - GetByteContext *gb = &s->gb; - - 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); - } else { - bytestream2_skip(gb, data_size + (data_size&1)); - } - } - } else if (!avpkt) { buf = avctx->extradata; buf_size = bytestream_get_be16(&buf); if (buf_size <= 1 || palette_size < 0) { @@ -273,7 +222,6 @@ static int extract_header(AVCodecContext *const avctx, buf_size, palette_size); return AVERROR_INVALIDDATA; } - } if (buf_size >= 41) { s->compression = bytestream_get_byte(&buf); @@ -449,7 +397,7 @@ static av_cold int decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } - if ((err = extract_header(avctx, NULL)) < 0) + if ((err = extract_header(avctx)) < 0) return err; return 0; @@ -1525,6 +1473,64 @@ static int unsupported(AVCodecContext *avctx) return AVERROR_INVALIDDATA; } +static int parse_packet_header(AVCodecContext *const avctx, + GetByteContext *gb) +{ + IffContext *s = avctx->priv_data; + int i; + + if (avctx->codec_tag == MKTAG('A', 'N', 'I', 'M')) { + uint32_t chunk_id; + uint64_t data_size; + + 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); + } else { + bytestream2_skip(gb, data_size + (data_size&1)); + } + } + } + + return 0; +} + static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt) { @@ -1538,7 +1544,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame, bytestream2_init(gb, avpkt->data, avpkt->size); - if ((res = extract_header(avctx, avpkt)) < 0) + if ((res = parse_packet_header(avctx, gb)) < 0) return res; if ((res = ff_get_buffer(avctx, frame, 0)) < 0)