From patchwork Fri May 17 20:00:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Osamu Watanabe X-Patchwork-Id: 48968 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:3a48:b0:1af:fc2d:ff5a with SMTP id zu8csp3091758pzb; Fri, 17 May 2024 13:00:34 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWzwoTyYwdMcOxnLuTYW77pETY3duUDlRyxfy/KNGkwlU1nrJ8LvBZWDMmNgFDIahy/nw6JyPZsxoEeHTHEMUBNH/jw8N/fpeWoUg== X-Google-Smtp-Source: AGHT+IGdRlkVUWhmmAmmC7nj4NvgBTW1c0RzgxoLRWsSnn+dA9mLoL+W6Hjvl9M7rSskht59AojF X-Received: by 2002:a05:600c:1d0a:b0:41f:e7e6:7f27 with SMTP id 5b1f17b1804b1-41feac55e31mr232773315e9.26.1715976033960; Fri, 17 May 2024 13:00:33 -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 a640c23a62f3a-a5a3be4ec60si865705666b.893.2024.05.17.13.00.33; Fri, 17 May 2024 13:00:33 -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=@takushoku.onmicrosoft.com header.s=selector2-takushoku-onmicrosoft-com header.b=b2mnGOC4; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9CBF568CA9C; Fri, 17 May 2024 23:00:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from JPN01-TYC-obe.outbound.protection.outlook.com (mail-tycjpn01on2103.outbound.protection.outlook.com [40.107.114.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 955B368CA9C for ; Fri, 17 May 2024 23:00:21 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IYE1qQXCubCgjlwFuzPjTiJZqhxx9lRi6ITeaEwc1DmRG1m2kd8tQ3KoCDNCd7aA8Zs2dWilbfUp9cM9b90WHw3ginHuDBRBNL/INf6xs6kCcsjOWc/3MHTHKzNGf1X/IrDaUkE8BBqGe3PBQMZNObLYdWRo72p71Iv9AugHJq+/+VbXpGd6/EFG9xGa7Yn6W1EHTsKISQSLhz60TQn3FUX5ERlzkG3xueNJL7SwPfGkuWtmvr961TM2aDNT4+7hKFYH1j9L/hYfUIukNKBRSnyujm+16g7LmRk2HL1L0scgDaqjZmllgGANiZoPzn8QwPC4glf5W57lqR+shmlLSw== 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=JS+WCsjqdZn/wF89bBOP+H3g/xhOvmDG29SpT4HzKrQ=; b=YZ1oGhuLfdlvC4zCku4jzFo1WOTRaq+8bR4voDsSCkeAVMM+I76TEQkeB3GDQIWVDmPML8fNvUfx+tIjkdFH7E6Bg77Y8NcLeVFcLKdPzxWXxa9SSyXNhRLA1P/bGDxs2fjXsG+PuA7D6Vr4yQhDPzF64Fyb4u8M35qG/daFwbBPItyavLyzjR9p1QuZHILTSM9UVNau61RXvakc4y26q5I9x97f/kIYwJ9u4o8q7DOws7kN7o/KE/2eHv5CYU7eZ9OUrgNch/JSLfiaqXh4rhz59CaHF+n9ZQFlgpaqciEsWiMnpIjdtOHBf0SWj6SVN7YsH3LxZxEMRrwxf2LBvg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=es.takushoku-u.ac.jp; dmarc=pass action=none header.from=es.takushoku-u.ac.jp; dkim=pass header.d=es.takushoku-u.ac.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=takushoku.onmicrosoft.com; s=selector2-takushoku-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JS+WCsjqdZn/wF89bBOP+H3g/xhOvmDG29SpT4HzKrQ=; b=b2mnGOC4XjqH9qVC3MzokyamczjfxcrmpoIAJeytDZlTtJZRsc9JvowBL6zwlyXt6QoS4fAXqeZYVfizeYdKQqOdQ8OWgISLvqvRq2d6cj9R3QsCCSzzfpzbmsNGPWm5pT03WUSzGyV5M2oonouSwKPJvhBqqivCq3IUkMWQHaQ= Received: from OS0PR01MB6001.jpnprd01.prod.outlook.com (2603:1096:604:b7::12) by TYCPR01MB11291.jpnprd01.prod.outlook.com (2603:1096:400:3c1::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.30; Fri, 17 May 2024 20:00:17 +0000 Received: from OS0PR01MB6001.jpnprd01.prod.outlook.com ([fe80::181c:c1f4:9b58:f6cc]) by OS0PR01MB6001.jpnprd01.prod.outlook.com ([fe80::181c:c1f4:9b58:f6cc%6]) with mapi id 15.20.7587.028; Fri, 17 May 2024 20:00:17 +0000 From: WATANABE Osamu To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH] avcodec/jpeg2000dec: fix HT block decoder issue #10905 Thread-Index: AQHaqJTWziZE09NHiE2iAaYsAXmiVQ== Date: Fri, 17 May 2024 20:00:16 +0000 Message-ID: Accept-Language: en-US, ja-JP Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=es.takushoku-u.ac.jp; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: OS0PR01MB6001:EE_|TYCPR01MB11291:EE_ x-ms-office365-filtering-correlation-id: c8d536b7-2d74-4c67-9020-08dc76abf909 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230031|376005|41320700004|1800799015|366007|38070700009; x-microsoft-antispam-message-info: =?iso-2022-jp?b?WVM4UHpoUHRZN01xajZZS0pm?= =?iso-2022-jp?b?Ny9kUjB3b1hqRnFzem13TXMveENhKzVDbmNJSVZXT3ZaSmt2WFJYLzdk?= =?iso-2022-jp?b?VmRCeTllNUdiUXFlT1RkbjJjM21GbGV6VGZmQUdnZmRpYWRPTXZxSXVa?= =?iso-2022-jp?b?STBYSmlweFRsNFFVS1dqQjJaOEJCL0FmejZvRnhSWlpTdEg4ZmlKbkhH?= =?iso-2022-jp?b?Kzhrd0IxNnE5aWFjU284UmhYaXRjWkxST0ZsQ2RxS3V0RDNseXFhc3hi?= =?iso-2022-jp?b?RmZOV0dNNlJRTUJlcEtKRXA2RjdtWk9mdUdodisrMEdVM3JaYkkwY1NG?= =?iso-2022-jp?b?cjcvN3NtTXluRitYK0pkVFc2QlVJSVhWVi9MdWxrbytuaWQrTzFUeGQ3?= =?iso-2022-jp?b?aGlXYkhXSWVXTWNrdDBWZ1RvWGFIYUlDaXNUb1pXN1QrR21vMkhwdHNG?= =?iso-2022-jp?b?Ym1vL0wrbGJqdkNtdlNTOHBqNy9qZnR5L1pRV3hZZTlHU0JoemxFSkFO?= =?iso-2022-jp?b?VHptbFhoNHNUak9qZGtoZUdSTFlFNm9zaGkrVmdYTTVmUVVJdVJXczVr?= =?iso-2022-jp?b?MG05Z3RmZW1hZytscVdDeVRrVlJUMm53cjVuN2FnUmlzSU5UN1Q2WkxF?= =?iso-2022-jp?b?VmEwNnFFMUVqU0VIQzhaMjYwZDF3NnFQUGRwZWpoU1VDZUt4OFBWcDhz?= =?iso-2022-jp?b?SHBiVWpuNTl5OHZTbk50WG1tSzZQTDBOdjM4R1JwaG4wVkxYN055SzJZ?= =?iso-2022-jp?b?YlJ3cVU2NUl3bFdqeWRrRU1yOGZMRGt2bjZQWk1ET2lxNUVxRmdweFpC?= =?iso-2022-jp?b?UUt4ZVdhbm1hQ1VkaTRibGZQQ0M1REg5WlBkQjJJMlNmdFdoZlk5SnZi?= =?iso-2022-jp?b?QUtXb2c0b09yYlBVL3VzRmcyRFJHN1QzbTBGckRpZW5Fb3BnbXpCVlNl?= =?iso-2022-jp?b?Uk5jODMrUDZ3TWNMNWYxR3BHcDc0b1dDL3JxMVUyQVN3VEZlYUpPZjZ1?= =?iso-2022-jp?b?UiswclZUeDZMNXU4SFBQc0NwQTFBbjhXcTk5NldwZDZaTHVxWU9RNHQ2?= =?iso-2022-jp?b?aVZZZjBsN3RpNDQ3SFUzRWFJYWdTVWdNKzZWbHhaWVFlVVpDMndUbm9o?= =?iso-2022-jp?b?VTFLVXlZZ2E1L0FFOVRndWpHVTE1ajk0anZ1N3ZhdUpyckwwRmY3eE05?= =?iso-2022-jp?b?S3R1cnFKVWZVME1JZUhzMXNoRXBZM1d2QzhTN3orSXBIdEQ1YVltUG1Z?= =?iso-2022-jp?b?S3QyUDVmbTF3RkNEQVF4Mi9IUVJ0N2w4MDZEUnI1Y2tMc21wZ3duc1NW?= =?iso-2022-jp?b?N2YvV0lnM1RjSkhvejJrbVF6QjRTOTBRZ1ZIRGYycE0wUkdYNXZPVTVh?= =?iso-2022-jp?b?Q2VxNG14OVFzTTA4R0xxSE9QZTJ4U3FsZFN6ditrQlFIUzhxRVZLMW02?= =?iso-2022-jp?b?Vk02V0VjZ3BtRjYwZy9oTC9XQldrbVEzd1FJeE9DelphNEl2aHN6NXYz?= =?iso-2022-jp?b?eXdaR0lXYzlUem9HSUZxanJwbi9hdmxjYTJ3TTdveTBRVHN4Mk5KU1VP?= =?iso-2022-jp?b?aG9NYXU4VE1BTm5KU1c4NnFZK0RZemlYZXBhOWE5RUVJVlorMDliZ0I2?= =?iso-2022-jp?b?cmxJS0NmRlJDQ3E0OXFDRXcyQjFCeDYrQnhoZ09UUnNIWnUxZERmcjZ5?= =?iso-2022-jp?b?blV2TmY5MkNlMm9mNjcraGNYNE5zcGNVVGc0NlRxSGlKSHJnOXlQaFF6?= =?iso-2022-jp?b?bGhGUUd4aHdCU3Q4QjVUQWk2NzlXTTZyZTRvTXUvUnlDSm5YM3RtZlVI?= =?iso-2022-jp?b?NWIyWk9RclpCNHdYakNXU29WWDVsNkFvc2Y3UjRsT0JsbnNWZDBwRFdN?= =?iso-2022-jp?b?MVI1MlIwTjNXWmx6RkoyS0FKV0R1QjZSV3A2LzFMenBZRTRWd2MzVzNO?= =?iso-2022-jp?b?eHFLcEtuZVFWVmx1S2FJd3RHanF0ZVZ6Y05sMlhiSkVOL1VvL2lXZ3lZ?= =?iso-2022-jp?b?U0hpZz09?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:OS0PR01MB6001.jpnprd01.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(376005)(41320700004)(1800799015)(366007)(38070700009); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-2022-jp?b?Rm5ydnp0RFVDRHdGTHl1?= =?iso-2022-jp?b?SDhTOGwyRGhlVmZoU1lEdWtaTlZvQXF1V2p3dXpORVhBRmtSdER6bndN?= =?iso-2022-jp?b?UnRwd3ZTa1diWUNSWUgyOGlvNHpMYjcrc1Q5N3hmWWJNajV3TlFVOEVh?= =?iso-2022-jp?b?cUpnbU0zTVVYYUNYaGtDK3pLTjVFN0RjR2dTL3lzbCs5TS9Hc295dFNG?= =?iso-2022-jp?b?aERUMnpSak5nK0RiMFZQMDVOb3RLdmQ2TVhZT1RseGkzUXNrMUtrd2sw?= =?iso-2022-jp?b?aDF3WGlvNWdvaCtZWTdSQk9mc1dpb1p4ejhrRUZDOElWdkpTSTdxZHNO?= =?iso-2022-jp?b?N0ZIQ052anQ5VEFSRVFTSjFMdXk3MXBGaXlJU0lEbnVaNHBsRHBpTGZo?= =?iso-2022-jp?b?V0VMQUNrLzIwVDVDM1RWSmVqMFFwcjdUVFEyb1Iyb0ErUXFrcE9JOHpH?= =?iso-2022-jp?b?RXN0MW51L1djbXNBUEhTRGtzOURzMnp0MHV3Q0U5SkxVWm5lNUZpNGcw?= =?iso-2022-jp?b?Q0xiK2dkQmpxa3hZSEtibkM1Rzl2R0hEczlWMi9JZ1o5aFdDWjBzdmR2?= =?iso-2022-jp?b?QXA2MGtnMWtjY3ZheWQ2WmRpUENIVUdXUitOdnM4ZUFiOGJWSXo4VDNG?= =?iso-2022-jp?b?WlBvdHF5NG5jU2tjdm1EaWY1Q01kRkhJVlgvdXRhVHByQVBxQU1CNkFl?= =?iso-2022-jp?b?ZzJ5TkdUTDlaK1JiSjNSbXNWT1lwdmdmV2RLT2hMNUYvSk9Cak8vV216?= =?iso-2022-jp?b?bDNsaC9sSEtISVZqWENET1ozTVJocXU5SVQ2ZDMrSWdjZmVxUGo0YkZ0?= =?iso-2022-jp?b?ZGxOVFF6SW10aGxFS045M0x0TXhaSGJGOVRHOG1iQi8zaVZSM1ZVQ2JM?= =?iso-2022-jp?b?RThqNjU5TWNwUjBMLzJRWGNCa3o2d0VmVjVESjlTRFYvb0VwVUduQXls?= =?iso-2022-jp?b?d2ZKc3hJdkpjdUZFbGx6ZUp2bk90RmJXWG91MmRDeFhIUThsbE9iTzNQ?= =?iso-2022-jp?b?TGUzcm1OTW1HaDR0WkFLaEowaUxjZ0RTcC9nS092VEVCZFhHWXhVaUJx?= =?iso-2022-jp?b?UmhiaU9pZmZhNW5KQm1oUHVUVll6eHlMVGpEcmhvZTNtUEM0MENCeEVt?= =?iso-2022-jp?b?dWxtV2FIZU1DdTN5OHBrdWE0QUx4UlRaSUV1Z3g0T3Z5TFExYlpqMHlq?= =?iso-2022-jp?b?KzYrSGpjWXJuSDZxaXhDeVY5R25CMTZWcVZjWDJLeXNtaXRWS0pOK3Rk?= =?iso-2022-jp?b?cWhMblRqb1VmM3I0dTF2djBqeGxCdFEreHBXbkNBOW5ZYmErR0JxQWpP?= =?iso-2022-jp?b?Q0dEa0F6cDNvSkl6Y01QNDBmT2NQcEdTQytnWnlENHhpK2FqNFZUS0Yv?= =?iso-2022-jp?b?dkNaeUZoYXRvZFRjQ3RVajBWeHRyYjh5MGJGVGxQZzJKV0d1MFBQRmtV?= =?iso-2022-jp?b?VjJESm1scHcyUHhsdU9WUUQ1VmhTR1pLYXRkYlVlUTBkK3RZZk0vQ2Nw?= =?iso-2022-jp?b?cXo2TDhDVk9DOUhZajVtNDlaOVR5bVg5RDgvdWw0Zkw5Z3RDUTJFQ0l4?= =?iso-2022-jp?b?dkRzU29JYmNkcUdERG5kQk1DV0FxMExFZ1dQY0JHYitjYnBoWU9USmJk?= =?iso-2022-jp?b?TmVRRjhiMy9HcDdOUFZ6WWQyOUJhbUh0Q29BUjV0M0tXSzJLWVZZMEto?= =?iso-2022-jp?b?Ung5eTlHYlJaMTZtTFNCejA2N3NMRG5DUTRBOCtVdTlJRTRvV1pUU25F?= =?iso-2022-jp?b?NlBOVS9LR2tyaURmVlVnNGxjYTJEdkJiWFl2N294c3BTc1hOUXkyd1R4?= =?iso-2022-jp?b?aXU3RzhqeEpyNUZHa2ZxaUZyeE8waUVLNFlUUFlzRGVacXJOK0VNOFNh?= =?iso-2022-jp?b?eFRkZ1Q0Qk5xM0hicGxkZUlvT1FKZFNrUXNOdnZ0blp1ZEc3Y2RVMXps?= =?iso-2022-jp?b?TXdKWkcxbzM0S1VlcFRjekY0cFhnOVM0VzVxdC9vVzRUYjhOc1ZWa1pz?= =?iso-2022-jp?b?Rm0vcm10bjFlS0dDNHRSNG9yY2xIcFRsY0NObUIzb2lNT1NOcGRxZHpH?= =?iso-2022-jp?b?Y1RVamp6MHJjQWdIT1g2RjFlRHg5dUl2MlpjaVU2NlVrUnJKaFczYTdH?= =?iso-2022-jp?b?Z2lNK05lWGlVVjlYaFdDYnpMaDhlaGJNSlFiYjlacTBpQ0VxcXk5NW9U?= =?iso-2022-jp?b?Slo5Y0wvRzkrbnh2WEJGTzZBMkZDbjdDelN2UnB6SjJEclI0ckJ3NkFB?= =?iso-2022-jp?b?eU5zaURjYndmWWY0bElEUFVTWVJKUXd0dGpQVXBUOHhKOGZ1VXpTclBw?= =?iso-2022-jp?b?RCtmUzBUeHBuTWZKaEJ3TUNVWWJRZ1BLOWpoSzFLNDNyZWpvS2w2Z2Y4?= =?iso-2022-jp?b?SjZFMU1Wa09QcjgwVmphTnErR0kxM05tZ0NvRGFYT0xubWh0ODdPbzdN?= =?iso-2022-jp?b?TXc2OFFNcjNYNzh1Z3Z0UXJwS0JWV2hoV01QRnc4dXd3TCtnWC9XNUVJ?= =?iso-2022-jp?b?WlE4Z3l0UFVLTmpvPQ==?= Content-ID: <1071C2DF81B0254091897112A012CEFB@jpnprd01.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: es.takushoku-u.ac.jp X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: OS0PR01MB6001.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c8d536b7-2d74-4c67-9020-08dc76abf909 X-MS-Exchange-CrossTenant-originalarrivaltime: 17 May 2024 20:00:16.8970 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 853333e5-13b1-4738-ae04-bfb589cf2665 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: /OjZo8kM0zBP8NSMp2IYn1o+6ciM/CMSIMeb3VrrmMKJGZ/V9QWZldHGtYu5XewhryDTxbgJSwFQv5v9jhiy7P6vwlACVDbocqKkg8QXOiM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCPR01MB11291 Subject: [FFmpeg-devel] [PATCH] avcodec/jpeg2000dec: fix HT block decoder issue #10905 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: Pierre-Anthony Lemieux Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ubD7mhyIDzY+ Signed-off-by: Pierre-Anthony Lemieux --- libavcodec/jpeg2000htdec.c | 122 ++++++++++++----------- tests/ref/fate/jpeg2000dec-ds0_ht_01_b11 | 2 +- 2 files changed, 63 insertions(+), 61 deletions(-) diff --git a/libavcodec/jpeg2000htdec.c b/libavcodec/jpeg2000htdec.c index fa704b665e..62f70c32a8 100644 --- a/libavcodec/jpeg2000htdec.c +++ b/libavcodec/jpeg2000htdec.c @@ -196,7 +196,7 @@ static void jpeg2000_bitbuf_refill_forward(StateVars *buffer, const uint8_t *arr while (buffer->bits_left < 32) { buffer->tmp = 0xFF; buffer->bits = (buffer->last == 0xFF) ? 7 : 8; - if (buffer->pos <= length) { + if (buffer->pos < length) { buffer->tmp = array[buffer->pos]; buffer->pos += 1; buffer->last = buffer->tmp; @@ -508,17 +508,17 @@ static int jpeg2000_decode_sig_emb(const Jpeg2000DecoderContext *s, MelDecoderSt } av_always_inline -static int jpeg2000_get_state(int x1, int x2, int width, int shift_by, +static int jpeg2000_get_state(int x1, int x2, int stride, int shift_by, const uint8_t *block_states) { - return (block_states[(x1 + 1) * (width + 2) + (x2 + 1)] >> shift_by) & 1; + return (block_states[(x1 + 1) * stride + (x2 + 1)] >> shift_by) & 1; } av_always_inline -static void jpeg2000_modify_state(int x1, int x2, int width, - int value, uint8_t *block_states) +static void jpeg2000_modify_state(int x1, int x2, int stride, + int value, uint8_t *block_states) { - block_states[(x1 + 1) * (width + 2) + (x2 + 1)] |= value; + block_states[(x1 + 1) * stride + (x2 + 1)] |= value; } av_always_inline @@ -528,8 +528,8 @@ static int jpeg2000_decode_ht_cleanup_segment(const Jpeg2000DecoderContext *s, StateVars *mel_stream, StateVars *vlc_stream, StateVars *mag_sgn_stream, const uint8_t *Dcup, uint32_t Lcup, uint32_t Pcup, uint8_t pLSB, - int width, int height, int32_t *sample_buf, - uint8_t *block_states) + int width, int height, const int stride, + int32_t *sample_buf, uint8_t *block_states) { uint16_t q = 0; // Represents current quad position uint16_t q1, q2; @@ -958,32 +958,32 @@ static int jpeg2000_decode_ht_cleanup_segment(const Jpeg2000DecoderContext *s, j1 = 2 * y; j2 = 2 * x; - sample_buf[j2 + (j1 * width)] = (int32_t)*mu; - jpeg2000_modify_state(j1, j2, width, *sigma, block_states); + sample_buf[j2 + (j1 * stride)] = (int32_t)*mu; + jpeg2000_modify_state(j1, j2, stride, *sigma, block_states); sigma += 1; mu += 1; x1 = y != quad_height - 1 || is_border_y == 0; - sample_buf[j2 + ((j1 + 1) * width)] = ((int32_t)*mu) * x1; - jpeg2000_modify_state(j1 + 1, j2, width, (*sigma) * x1, block_states); + sample_buf[j2 + ((j1 + 1) * stride)] = ((int32_t)*mu) * x1; + jpeg2000_modify_state(j1 + 1, j2, stride, (*sigma) * x1, block_states); sigma += 1; mu += 1; x2 = x != quad_width - 1 || is_border_x == 0; - sample_buf[(j2 + 1) + (j1 * width)] = ((int32_t)*mu) * x2; - jpeg2000_modify_state(j1, j2 + 1, width, (*sigma) * x2, block_states); + sample_buf[(j2 + 1) + (j1 * stride)] = ((int32_t)*mu) * x2; + jpeg2000_modify_state(j1, j2 + 1, stride, (*sigma) * x2, block_states); sigma += 1; mu += 1; x3 = x1 | x2; - sample_buf[(j2 + 1) + (j1 + 1) * width] = ((int32_t)*mu) * x3; - jpeg2000_modify_state(j1 + 1, j2 + 1, width, (*sigma) * x3, block_states); + sample_buf[(j2 + 1) + (j1 + 1) * stride] = ((int32_t)*mu) * x3; + jpeg2000_modify_state(j1 + 1, j2 + 1, stride, (*sigma) * x3, block_states); sigma += 1; mu += 1; } } ret = 1; -free: + free: av_freep(&sigma_n); av_freep(&E); av_freep(&mu_n); @@ -992,39 +992,39 @@ free: static void jpeg2000_calc_mbr(uint8_t *mbr, const uint16_t i, const uint16_t j, const uint32_t mbr_info, uint8_t causal_cond, - uint8_t *block_states, int width) + uint8_t *block_states, int stride) { int local_mbr = 0; - local_mbr |= jpeg2000_get_state(i - 1, j - 1, width, HT_SHIFT_SIGMA, block_states); - local_mbr |= jpeg2000_get_state(i - 1, j + 0, width, HT_SHIFT_SIGMA, block_states); - local_mbr |= jpeg2000_get_state(i - 1, j + 1, width, HT_SHIFT_SIGMA, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j - 1, stride, HT_SHIFT_SIGMA, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j + 0, stride, HT_SHIFT_SIGMA, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j + 1, stride, HT_SHIFT_SIGMA, block_states); - local_mbr |= jpeg2000_get_state(i + 0, j - 1, width, HT_SHIFT_SIGMA, block_states); - local_mbr |= jpeg2000_get_state(i + 0, j + 1, width, HT_SHIFT_SIGMA, block_states); + local_mbr |= jpeg2000_get_state(i + 0, j - 1, stride, HT_SHIFT_SIGMA, block_states); + local_mbr |= jpeg2000_get_state(i + 0, j + 1, stride, HT_SHIFT_SIGMA, block_states); - local_mbr |= jpeg2000_get_state(i + 1, j - 1, width, HT_SHIFT_SIGMA, block_states) * causal_cond; - local_mbr |= jpeg2000_get_state(i + 1, j + 0, width, HT_SHIFT_SIGMA, block_states) * causal_cond; - local_mbr |= jpeg2000_get_state(i + 1, j + 1, width, HT_SHIFT_SIGMA, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j - 1, stride, HT_SHIFT_SIGMA, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j + 0, stride, HT_SHIFT_SIGMA, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j + 1, stride, HT_SHIFT_SIGMA, block_states) * causal_cond; - local_mbr |= jpeg2000_get_state(i - 1, j - 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i - 1, j - 1, width, HT_SHIFT_SCAN, block_states); - local_mbr |= jpeg2000_get_state(i - 1, j + 0, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i - 1, j - 1, width, HT_SHIFT_SCAN, block_states); - local_mbr |= jpeg2000_get_state(i - 1, j + 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i - 1, j + 1, width, HT_SHIFT_SCAN, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j - 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i - 1, j - 1, stride, HT_SHIFT_SCAN, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j + 0, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i - 1, j - 1, stride, HT_SHIFT_SCAN, block_states); + local_mbr |= jpeg2000_get_state(i - 1, j + 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i - 1, j + 1, stride, HT_SHIFT_SCAN, block_states); - local_mbr |= jpeg2000_get_state(i + 0, j - 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i + 0, j - 1, width, HT_SHIFT_SCAN, block_states); - local_mbr |= jpeg2000_get_state(i + 0, j + 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i + 0, j + 1, width, HT_SHIFT_SCAN, block_states); + local_mbr |= jpeg2000_get_state(i + 0, j - 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i + 0, j - 1, stride, HT_SHIFT_SCAN, block_states); + local_mbr |= jpeg2000_get_state(i + 0, j + 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i + 0, j + 1, stride, HT_SHIFT_SCAN, block_states); - local_mbr |= jpeg2000_get_state(i + 1, j - 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i + 1, j - 1, width, HT_SHIFT_SCAN, block_states) * causal_cond; - local_mbr |= jpeg2000_get_state(i + 1, j + 0, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i + 1, j + 0, width, HT_SHIFT_SCAN, block_states) * causal_cond; - local_mbr |= jpeg2000_get_state(i + 1, j + 1, width, HT_SHIFT_REF, block_states) * - jpeg2000_get_state(i + 1, j + 1, width, HT_SHIFT_SCAN, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j - 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i + 1, j - 1, stride, HT_SHIFT_SCAN, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j + 0, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i + 1, j + 0, stride, HT_SHIFT_SCAN, block_states) * causal_cond; + local_mbr |= jpeg2000_get_state(i + 1, j + 1, stride, HT_SHIFT_REF, block_states) * + jpeg2000_get_state(i + 1, j + 1, stride, HT_SHIFT_SCAN, block_states) * causal_cond; *mbr |= local_mbr; } @@ -1040,18 +1040,18 @@ static void jpeg2000_process_stripes_block(StateVars *sig_prop, int i_s, int j_s int modify_state, cond; uint8_t bit; uint8_t causal_cond = i != (i_s + height - 1); - int32_t *sp = &sample_buf[j + (i * (stride - 2))]; + int32_t *sp = &sample_buf[j + (i * (stride))]; uint8_t mbr = 0; if (jpeg2000_get_state(i, j, stride - 2, HT_SHIFT_SIGMA, block_states) == 0) - jpeg2000_calc_mbr(&mbr, i, j, mbr_info & 0x1EF, causal_cond, block_states, stride - 2); + jpeg2000_calc_mbr(&mbr, i, j, mbr_info & 0x1EF, causal_cond, block_states, stride); mbr_info >>= 3; cond = mbr != 0; bit = jpeg2000_peek_bit(sig_prop, magref_segment, magref_length); *sp |= (bit * cond) << pLSB; sig_prop->bits -= cond; modify_state = (((1 << HT_SHIFT_REF_IND) | (1 << HT_SHIFT_REF)) * cond) | 1 << HT_SHIFT_SCAN; - jpeg2000_modify_state(i, j, stride - 2, modify_state, block_states); + jpeg2000_modify_state(i, j, stride, modify_state, block_states); } } } @@ -1060,8 +1060,8 @@ static void jpeg2000_process_stripes_block(StateVars *sig_prop, int i_s, int j_s * See procedure decodeSigPropMag at Rec. ITU-T T.814, 7.4. */ av_noinline -static void jpeg2000_decode_sigprop_segment(Jpeg2000Cblk *cblk, uint16_t width, - uint16_t height, uint8_t *magref_segment, +static void jpeg2000_decode_sigprop_segment(Jpeg2000Cblk *cblk, uint16_t width, uint16_t height, + const int stride, uint8_t *magref_segment, uint32_t magref_length, uint8_t pLSB, int32_t *sample_buf, uint8_t *block_states) { @@ -1071,7 +1071,6 @@ static void jpeg2000_decode_sigprop_segment(Jpeg2000Cblk *cblk, uint16_t width, const uint16_t num_h_stripe = width / 4; int b_width = 4; int b_height = 4; - int stride = width + 2; int last_width; uint16_t i = 0, j = 0; @@ -1114,7 +1113,7 @@ static void jpeg2000_decode_sigprop_segment(Jpeg2000Cblk *cblk, uint16_t width, * See procedure decodeSigPropMag at Rec. ITU-T T.814, 7.5. */ static int -jpeg2000_decode_magref_segment( uint16_t width, uint16_t block_height, +jpeg2000_decode_magref_segment( uint16_t width, uint16_t block_height, const int stride, uint8_t *magref_segment,uint32_t magref_length, uint8_t pLSB, int32_t *sample_buf, uint8_t *block_states) { @@ -1134,7 +1133,7 @@ jpeg2000_decode_magref_segment( uint16_t width, uint16_t block_height, * We move column wise, going from one quad to another. See * Rec. ITU-T T.814, Figure 7. */ - sp = &sample_buf[j + i * width]; + sp = &sample_buf[j + i * stride]; if (jpeg2000_get_state(i, j, width, HT_SHIFT_SIGMA, block_states) != 0) { jpeg2000_modify_state(i, j, width, 1 << HT_SHIFT_REF_IND, block_states); *sp |= jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length) << pLSB; @@ -1146,7 +1145,7 @@ jpeg2000_decode_magref_segment( uint16_t width, uint16_t block_height, height = block_height % 4; for (int j = 0; j < width; j++) { for (int i = i_start; i < i_start + height; i++) { - sp = &sample_buf[j + i * width]; + sp = &sample_buf[j + i * stride]; if (jpeg2000_get_state(i, j, width, HT_SHIFT_SIGMA, block_states) != 0) { jpeg2000_modify_state(i, j, width, 1 << HT_SHIFT_REF_IND, block_states); *sp |= jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length) << pLSB; @@ -1194,6 +1193,9 @@ ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c int32_t M_b = magp; + const int quad_buf_width = width + 4; + const int quad_buf_height = height + 4; + /* codeblock size as constrained by Rec. ITU-T T.800, Table A.18 */ av_assert0(width <= 1024U && height <= 1024U); av_assert0(width * height <= 4096); @@ -1261,23 +1263,23 @@ ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c jpeg2000_init_mel_decoder(&mel_state); - sample_buf = av_calloc((width + 4) * (height + 4), sizeof(int32_t)); - block_states = av_calloc((width + 4) * (height + 4), sizeof(uint8_t)); + sample_buf = av_calloc(quad_buf_width * quad_buf_height, sizeof(int32_t)); + block_states = av_calloc(quad_buf_width * quad_buf_height, sizeof(uint8_t)); if (!sample_buf || !block_states) { ret = AVERROR(ENOMEM); goto free; } if ((ret = jpeg2000_decode_ht_cleanup_segment(s, cblk, t1, &mel_state, &mel, &vlc, - &mag_sgn, Dcup, Lcup, Pcup, pLSB, width, - height, sample_buf, block_states)) < 0) { + &mag_sgn, Dcup, Lcup, Pcup, pLSB, width, + height, quad_buf_width, sample_buf, block_states)) < 0) { av_log(s->avctx, AV_LOG_ERROR, "Bad HT cleanup segment\n"); goto free; } if (cblk->npasses > 1) - jpeg2000_decode_sigprop_segment(cblk, width, height, Dref, Lref, - pLSB - 1, sample_buf, block_states); + jpeg2000_decode_sigprop_segment(cblk, width, height, quad_buf_width, Dref, Lref, + pLSB - 1, sample_buf, block_states); if (cblk->npasses > 2) { @@ -1286,7 +1288,7 @@ ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c ret = AVERROR_INVALIDDATA; goto free; } - if ((ret = jpeg2000_decode_magref_segment(width, height, Dref, Lref, + if ((ret = jpeg2000_decode_magref_segment(width, height, quad_buf_width, Dref, Lref, pLSB - 1, sample_buf, block_states)) < 0) goto free; } @@ -1297,14 +1299,14 @@ ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { n = x + (y * t1->stride); - val = sample_buf[x + (y * width)]; + val = sample_buf[x + (y * quad_buf_width)]; /* Convert sign-magnitude to two's complement. */ val = val >> 31 ? 0x80000000 - val : val; val >>= (pLSB - 1); t1->data[n] = val; } } -free: + free: av_freep(&sample_buf); av_freep(&block_states); return ret; diff --git a/tests/ref/fate/jpeg2000dec-ds0_ht_01_b11 b/tests/ref/fate/jpeg2000dec-ds0_ht_01_b11 index af3eaa086d..d923cc2109 100644 --- a/tests/ref/fate/jpeg2000dec-ds0_ht_01_b11 +++ b/tests/ref/fate/jpeg2000dec-ds0_ht_01_b11 @@ -3,4 +3,4 @@ #codec_id 0: rawvideo #dimensions 0: 128x128 #sar 0: 0/1 -0, 0, 0, 1, 16384, 0x44426324 +0, 0, 0, 1, 16384, 0x04a3647e