From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 3F970471C8 for ; Tue, 15 Jul 2025 05:07:12 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 76CBE68DB44; Tue, 15 Jul 2025 08:07:07 +0300 (EEST) Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazon11020128.outbound.protection.outlook.com [52.101.227.128]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 3A96D68D436 for ; Tue, 15 Jul 2025 08:07:00 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=C8kyPfRDfKM+SS2PagFRu+Yxq4180ZDL294+hMk7ltobvFmS4vZ10TmBrm6onqFIMLIDZrxJcT/Aejf67kLp1uqeeAoC1uSRrIa1eENtAmsKer/BvOP9oFunuIzHY/+fzs12GV5y3sC+aPmhFpJ7Wdgfa695OgkkuAYs9QoEOIZPEMvVshR1jU8C3AboGgHkRpY1sWVkA+ZmfnlLvhMVefn7//es79YrILz4+u51DxJKTiYUmKfAVgvX9GDoA3YWWzEpr/nXm4iSyamII9EXo5nzUS5D5hTzZyk8f1lyY2UU9BCThEmpBnU/29OqAW0+c6CFL7k9nSEyC56qPifzcA== 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=7H3jLRM9iV8HfiO7MiQ8h/Lmh2S6uUpOwY/FWe9cVCE=; b=EYDdSzWfFmLJG+OGlqsi7yrA4ufNSTxAD2OZxVQt5DP0SfiYzim+gQlnp/0bjwOL20toGvYuHKfG9CIbHLGVZbBRa3k5/NbfSHkpub2O8elrAdKQ7BY7JsOXzCkOATqEhOsq2uNy9zF4g9p2yRihcnoxCoVamWHFNtoqYAeoMtFyZpcyOk2oxP38wFpcp89sSppsPvwL+6YJLQsHaXrDfTdn5ZjyFgWPLgmgqhjjyuaCrIIT1A4yzIOXLs6tX+/6wEzuzJ7NbcB1LT+KxyIdXKVsQJ1VfRkxALaTn9KZhasDrmAL/3WSxBv9PVT2i5q5xcUb0Tequ1+S2y7QyaaYAA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=multicorewareinc.com; dmarc=pass action=none header.from=multicorewareinc.com; dkim=pass header.d=multicorewareinc.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=multicorewareinc.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7H3jLRM9iV8HfiO7MiQ8h/Lmh2S6uUpOwY/FWe9cVCE=; b=TlOq1nO3cD4+9xgm8iRqe5ontLGlUoYNG7yrQG52RSwDuwOALuQ3YNQIejipH59zHEf7o0pHdIypFLO3ZYio/svzxCANixd/cgEBzpZEgVP+zj12K6BGI/55jz9BDBaGjuEoCFQ8qsmj8Jqh2KfVBQgl2V9CRzw0hzFwhID7sG6ssUuXEP0kepKTnkFokPRj8CepFbuUO5rspPEsth0bGaEow8JTJ4DYOZZtJTxcKEflfczvzxUUG5mUzy8sULiN8hJPgakCcbHaBr71Nu4Roo+F9gGqS7X8/pzVYWUzmqNMVcFGY1GIpwNJztW5odeHReRHItW+BfvjUJZggoCHnw== Received: from PN3P287MB3339.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:22d::6) by PN5P287MB4326.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:2bc::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8922.32; Tue, 15 Jul 2025 05:06:54 +0000 Received: from PN3P287MB3339.INDP287.PROD.OUTLOOK.COM ([fe80::4a22:77a3:8f7d:445]) by PN3P287MB3339.INDP287.PROD.OUTLOOK.COM ([fe80::4a22:77a3:8f7d:445%4]) with mapi id 15.20.8922.028; Tue, 15 Jul 2025 05:06:54 +0000 From: Logaprakash Ramajayam To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] [PATCH v2 1/1] swscale/aarch64/output: Implement neon assembly for yuv2planeX_10_c_template() Thread-Index: AQHb9UKPgTMtv7k500G9ixUFc3lDRg== Date: Tue, 15 Jul 2025 05:06:54 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: undefined: 2496470 drawingcanvaselements: [] composetype: newMail authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=multicorewareinc.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PN3P287MB3339:EE_|PN5P287MB4326:EE_ x-ms-office365-filtering-correlation-id: 9367170a-2e05-413f-df5b-08ddc35d6aa0 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|366016|376014|8096899003|38070700018|4053099003; x-microsoft-antispam-message-info: =?iso-8859-1?Q?+NXa47j8RtC1U9lf9GP3NuLQmWx45GF8LllkRrYPdfl9nuB5PYJMzykECK?= =?iso-8859-1?Q?jSkC0sEwRAOkcNQNpirLzQNt/lDnrY2rrHMSAe3j0n85G8PagDCsp3o2fc?= =?iso-8859-1?Q?GPUPUTm3+T0gvvLF9G0OFx17ko9kCV3z+vXo7V/EorMxIlk3V4f4MTencp?= =?iso-8859-1?Q?LkkblmYPAL2ZHQqNFCXKje4KQ+Q8b1m4Qv+HjZtNsXjAPVNfEGWWNeFKaf?= =?iso-8859-1?Q?0LUFx519fyDL4A9bxS4UT4zfdFEG8tz567vw1jw7lh9MYDAhjCOrx1EYzk?= =?iso-8859-1?Q?9NrHkRVmqXMoJZ5sgF0g/GSNd3WXKYNojK2723+FaC07BFy/MP8qdZ3bhw?= =?iso-8859-1?Q?PMxI9cNwt9Lz9mgue3gE0NXSVKzH6pu9LFvX5hXbeqcyNRouNQfF85lyo6?= =?iso-8859-1?Q?L8Qdbx/R6fwqUhx0Jw5eovK02/esWRYLEftJgUUCZLs00AiL+QWaz6NrvK?= =?iso-8859-1?Q?R0yEmzLBZUd9mHg3lR5RTWFo1IyMJwG1ShtsxEoUmv67FjT2noJleqG76y?= =?iso-8859-1?Q?oPHq05RKMcYU4D1xS9Ui6+OROpeoEf64YSKs9zNLdMX2+vp993esSzb2g+?= =?iso-8859-1?Q?UKXxpOZcl+yPxy5qNRRPDFX9i+N2VQiza7sckWcuZUVM0GmnYOoxlDastQ?= =?iso-8859-1?Q?a5um6wgxOkVo3Caa7vqTasfQVIUG0z0/6hV6fCC3Dm1He8Yh9zANWB2TIV?= =?iso-8859-1?Q?iFXA54Eo3vqLWPAFzZmUT7J94eZUn2Z+hXoZQVvgYow0D7clsWhg9blgLl?= =?iso-8859-1?Q?Eial+lJdNM1i5WXL8Ej+J+0SkofFFIG4r9pHMqpxvbpyMorbF1bZdzaDz5?= =?iso-8859-1?Q?hUUB9zJmUWuah9POm8tPJg1CLOCEZ+ACjqinECZzqjNKKGSp6jdqpm6FG0?= =?iso-8859-1?Q?pMX6uO9l/17VJILEi1iHZ8FUVqe4HwKmH1O5Wu8nBK6fp0ueVDaE7mhG25?= =?iso-8859-1?Q?4rT251fjiL55LPEN3euZI4NBVsPx76iDD+wsLxRGbc3hhFgMYtaYvBBg5D?= =?iso-8859-1?Q?Ohio3noIilBOnvSjWM7JYnWn8igg4fr7AsH8naxggWFyPVP6u5+EN/og3L?= =?iso-8859-1?Q?iTHh8PMjGhjgmSYzjALzwtJX+2spYQRLjftzUGmhWktWVYbgASqqgHstv6?= =?iso-8859-1?Q?7BmIZPpgVN2eMg9/K08Nd0LnHP+uPnUBptTZrc69Ug4nkt6FX9KDEbO8aK?= =?iso-8859-1?Q?x/dm8vp06TIjWRwJtDq/dnBoIrkDKdBeg6roSn/Nur1FsFlayMM3HXOeRN?= =?iso-8859-1?Q?KQI9LcQhX3bWBRzsll5ps6YiSEmPBlM+qzlXnyTS/kVABvOJaGrO1DDS3Y?= =?iso-8859-1?Q?M+YE+zuR+MNk/zGih7KWgV9ETjfPPtPN+xTUHtf+aV++nSVV2HMtyuvusj?= =?iso-8859-1?Q?MIbwdhA6lzEZ/6nnDHvy77bASQZN/CJ0Z2GNWEUFUgaGFypuPOyeFztQYZ?= =?iso-8859-1?Q?pIbcLvWGiXhQUZjK1S2aDZLY611g2xrYa+QxH5un3Qz1TMaxlUmt9lj2E/?= =?iso-8859-1?Q?ZjUPY89nLnAFombc+KoDhNXeXky/ntb6N/9j5q0Ag6gg=3D=3D?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PN3P287MB3339.INDP287.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(366016)(376014)(8096899003)(38070700018)(4053099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?Nh9koxopEMbuVwjx2OtE1apg5kITgsMMa9B73rr9YGqv4qMFjfG86pNMqq?= =?iso-8859-1?Q?aoNfwITwVHiQnIGCntZx0JtdnqJ7OonalWg0O43XzsIF/DadNnbx70LwZE?= =?iso-8859-1?Q?wYkYaMOWGZ2bncWo+Euch+OpUCDlMcFGBa+KIpZ9ZDswrN4Yhg+pnCHW7V?= =?iso-8859-1?Q?+p6tiOu1/5uixW4OgUfhf3SsLafXriYSCO61plmIlSZ79PhRVbYbs+nIQd?= =?iso-8859-1?Q?ljQdzM7hYfLCP22uxmuhGfm6+X02xAoBbgOe7tH8DZeMVZU4fkN1ttSJ9E?= =?iso-8859-1?Q?SSvFrTOpkh9p/82ioXLJHM95+HhrnMtzSyw4/oCaTxnZRJpyUQ064cBa3o?= =?iso-8859-1?Q?sCwGV2N6BXl0CmHtunCDCATuMXsAdyFVfDuezIyok5LVgsOURmWaOjfb1q?= =?iso-8859-1?Q?zP/QqdkLVWHr7OvfI4eP2xSkH4yThHiskRpiAQ5E7P5dFPs9h7mMt8hjuM?= =?iso-8859-1?Q?1F6KvsWU+TbRFdx84Wom6BjBd4WJwtY8+qno56NlrkLFWaiwuHGN/dYPlR?= =?iso-8859-1?Q?oFsps5aGr27qskgrif3Kg/ZULAtjLTiuKmvoPDucY2mtue+y9L3Ecw5VW8?= =?iso-8859-1?Q?Ze6nBqNnd9TXX76oFzuNmci0+P3MAQh/hj5I2cG9wETsFORYFyye1tcCza?= =?iso-8859-1?Q?PGrKy+egn0ClH8RRK9IcBeKUN46jo/9DTwsTSwGwePZJ/kUVUI4n7nLDmg?= =?iso-8859-1?Q?ytescbfxL0/gpoCWdTjBcjMXXwWiDGfeMA+TWxJtkkPN/pcyUZfMep4VkT?= =?iso-8859-1?Q?4BkPlYYw9OhrrEW3om30Qxgdlv2hQcn0zMic77ptR1naIX7qfGHVW1nLCV?= =?iso-8859-1?Q?0/0DadLDfc9fGZzzIdLtj9ymS/LzKZ6swHsWWu09b1kin7lPnBP4N+mLkm?= =?iso-8859-1?Q?S9eGphsgw95PZY6cixQ1up85vc9ICh5hB/Z8+j9BsmqpOd87UJhvQA/6CK?= =?iso-8859-1?Q?i63robaXB9SyqOgexijjb4xFDLo+GlGFKx1GZ6kSlSa81sqh7R1MP/VoW7?= =?iso-8859-1?Q?MnKaiP//QQDvoY2LkbD3w+uLcRYdaWiNPRJJBmjW3En/nQ2dtrFKYss5w7?= =?iso-8859-1?Q?H7mXhFFUzuIsiPCENOiuh7/iS2tXUvy21m4mkOySGV8k4hvu8cFq1QvS/G?= =?iso-8859-1?Q?v1v99d44QX+xg1qM0KyaIFRmiEUh9/yzdWPxD+ywTzsKxMBE1ZPR74N4jw?= =?iso-8859-1?Q?ryDZ9eNiy6Uprqm/AkY38fYioK8Sq/YyrFvxNZemLtAtfo0Eh/0ljgP4C4?= =?iso-8859-1?Q?kfj7C52VCwmyWuhQbtihB6wlfuTJYCREjUFm885tsa6uInvle3fUpVxWkS?= =?iso-8859-1?Q?5uvOUtA6B/aLmZMxuAQPsWL+P8S/j5ENoBcIUlIfUjC2E+rKS8q+H/KNA9?= =?iso-8859-1?Q?m9QwT3o03hPFzaYBKULx5UJmaElgkCMugB+AVwRK/9f1+rWkGcx0ijt58e?= =?iso-8859-1?Q?kCx0f4lBuPsYM+TLES1wUA8nFWLBJFlHo9cXnrKyKU5K+7j8t5RzA/ZywP?= =?iso-8859-1?Q?nCVKYUH0ni+fCpRiOYkmX9JDK3AUCAzMO2QmhJ8bLzb5IOy/xbm3CtY+bP?= =?iso-8859-1?Q?B+VdNjIPf+oCQ3NFOaxPLHYOZzF51DkZ9f5JAHPmLqFMio/DOu7y38R1QG?= =?iso-8859-1?Q?9xWasL8BCfaFCo0LSscC2RZrDO5P2yPxcVa+9gwIIScEkRlqDXk62QwIOv?= =?iso-8859-1?Q?hjHaQQi+YWYMRVizjdc=3D?= Content-Type: multipart/mixed; boundary="_004_PN3P287MB3339E53168F261F6CCCF13B79A57APN3P287MB3339INDP_" MIME-Version: 1.0 X-OriginatorOrg: multicorewareinc.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PN3P287MB3339.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 9367170a-2e05-413f-df5b-08ddc35d6aa0 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jul 2025 05:06:54.4472 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: ffc5e88b-3fa2-4d69-a468-344b6b766e7d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: qMIUXE11YB7AZljNXzZe0dkyIsIBsZGkComeawPPqzNg6UhcTEEik/NeoGrlHt6OqoIEb6myo0HWj0FvYtnI6YInDNlrUiAY14NHlMbk7pno+855ReRraYWx6BA2vzchPzFaQvY+Kus691w6YEemkA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN5P287MB4326 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH v2 1/1] swscale/aarch64/output: Implement neon assembly for yuv2planeX_10_c_template() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --_004_PN3P287MB3339E53168F261F6CCCF13B79A57APN3P287MB3339INDP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Handled all the comments and attaching the checkasm results. Checkasm Benchmark results: yuv2yuvX_10_LE_16_0_512_accurate_c: 7836.9 ( 1.00x) yuv2yuvX_10_LE_16_0_512_accurate_neon: 840.4 ( 9.33x) yuv2yuvX_10_LE_16_0_512_approximate_c: 7930.8 ( 1.00x) yuv2yuvX_10_LE_16_0_512_approximate_neon: 838.5 ( 9.46x) yuv2yuvX_10_LE_16_16_512_accurate_c: 7594.3 ( 1.00x) yuv2yuvX_10_LE_16_16_512_accurate_neon: 815.2 ( 9.32x) yuv2yuvX_10_LE_16_16_512_approximate_c: 7687.0 ( 1.00x) yuv2yuvX_10_LE_16_16_512_approximate_neon: 811.9 ( 9.47x) yuv2yuvX_10_LE_16_32_512_accurate_c: 7366.4 ( 1.00x) yuv2yuvX_10_LE_16_32_512_accurate_neon: 785.8 ( 9.37x) yuv2yuvX_10_LE_16_32_512_approximate_c: 7426.5 ( 1.00x) yuv2yuvX_10_LE_16_32_512_approximate_neon: 786.4 ( 9.44x) yuv2yuvX_10_LE_16_48_512_accurate_c: 7123.1 ( 1.00x) yuv2yuvX_10_LE_16_48_512_accurate_neon: 761.7 ( 9.35x) yuv2yuvX_10_LE_16_48_512_approximate_c: 7182.7 ( 1.00x) yuv2yuvX_10_LE_16_48_512_approximate_neon: 763.0 ( 9.41x) yuv2yuvX_10_BE_16_0_512_accurate_c: 8092.6 ( 1.00x) yuv2yuvX_10_BE_16_0_512_accurate_neon: 860.2 ( 9.41x) yuv2yuvX_10_BE_16_0_512_approximate_c: 8183.5 ( 1.00x) yuv2yuvX_10_BE_16_0_512_approximate_neon: 861.4 ( 9.50x) yuv2yuvX_10_BE_16_16_512_accurate_c: 7837.4 ( 1.00x) yuv2yuvX_10_BE_16_16_512_accurate_neon: 834.0 ( 9.40x) yuv2yuvX_10_BE_16_16_512_approximate_c: 7927.9 ( 1.00x) yuv2yuvX_10_BE_16_16_512_approximate_neon: 834.6 ( 9.50x) yuv2yuvX_10_BE_16_32_512_accurate_c: 7605.1 ( 1.00x) yuv2yuvX_10_BE_16_32_512_accurate_neon: 807.5 ( 9.42x) yuv2yuvX_10_BE_16_32_512_approximate_c: 7691.4 ( 1.00x) yuv2yuvX_10_BE_16_32_512_approximate_neon: 807.3 ( 9.53x) yuv2yuvX_10_BE_16_48_512_accurate_c: 7344.3 ( 1.00x) yuv2yuvX_10_BE_16_48_512_accurate_neon: 782.7 ( 9.38x) yuv2yuvX_10_BE_16_48_512_approximate_c: 7440.1 ( 1.00x) yuv2yuvX_10_BE_16_48_512_approximate_neon: 781.9 ( 9.51x) >From 3e14b4c2e763d2d0c8979e3e99578f5492b7130c Mon Sep 17 00:00:00 2001 From: Logaprakash Ramajayam Date: Tue, 1 Jul 2025 23:48:36 -0700 Subject: [PATCH v2 1/1] swscale/aarch64/output: Implement neon assembly for= yuv2planeX_10_c_template() --- libswscale/aarch64/output.S | 189 +++++++++++++++++++++++++++++++++++ libswscale/aarch64/swscale.c | 38 +++++++ tests/checkasm/sw_scale.c | 170 ++++++++++++++++++++----------- 3 files changed, 337 insertions(+), 60 deletions(-) diff --git a/libswscale/aarch64/output.S b/libswscale/aarch64/output.S index 190c438870..2aad420db2 100644 --- a/libswscale/aarch64/output.S +++ b/libswscale/aarch64/output.S @@ -20,6 +20,195 @@ #include "libavutil/aarch64/asm.S" +function ff_yuv2planeX_10_neon, export=3D1 +// x0 =3D filter (int16_t*) +// w1 =3D filterSize +// x2 =3D src (int16_t**) +// x3 =3D dest (uint16_t*) +// w4 =3D dstW +// w5 =3D big_endian +// w6 =3D output_bits + + mov w8, #27 + sub w8, w8, w6 // shift =3D 11 + = 16 - output_bits + + sub w9, w8, #1 + mov w10, #1 + lsl w9, w10, w9 // val =3D 1 << (s= hift - 1) + + dup v1.4s, w9 + dup v2.4s, w9 // Create vectors = with val + + neg w16, w8 + dup v20.4s, w16 // Create (-shift)= vector for right shift + + mov w10, #1 + lsl w10, w10, w6 + sub w10, w10, #1 // (1U << output_b= its) - 1 + dup v21.4s, w10 // Create Clip vec= tor for upper bound + + mov x7, #0 // i =3D 0 + +1: + cmp w4, #16 // Process 16-pixe= ls if available + blt 4f + + mov v3.16b, v1.16b + mov v4.16b, v2.16b + mov v5.16b, v1.16b + mov v6.16b, v2.16b + + mov w11, w1 // tmpfilterSize = =3D filterSize + mov x12, x2 // srcp =3D src + mov x13, x0 // filterp =3D fil= ter + +2: // Filter loop + + ldp x14, x15, [x12], #16 // get 2 pointers:= src[j] and src[j+1] + ldr s7, [x13], #4 // load filter coe= fficients + add x14, x14, x7, lsl #1 + add x15, x15, x7, lsl #1 + ld1 {v16.8h, v17.8h}, [x14] + ld1 {v18.8h, v19.8h}, [x15] + + // Multiply-accumulate + smlal v3.4s, v16.4h, v7.h[0] + smlal2 v4.4s, v16.8h, v7.h[0] + smlal v5.4s, v17.4h, v7.h[0] + smlal2 v6.4s, v17.8h, v7.h[0] + + smlal v3.4s, v18.4h, v7.h[1] + smlal2 v4.4s, v18.8h, v7.h[1] + smlal v5.4s, v19.4h, v7.h[1] + smlal2 v6.4s, v19.8h, v7.h[1] + + subs w11, w11, #2 // tmpfilterSize -= =3D 2 + b.gt 2b // continue filter= loop + + // Shift results + sshl v3.4s, v3.4s, v20.4s + sshl v4.4s, v4.4s, v20.4s + sshl v5.4s, v5.4s, v20.4s + sshl v6.4s, v6.4s, v20.4s + + // Clamp to upper bound + smin v3.4s, v3.4s, v21.4s + smin v4.4s, v4.4s, v21.4s + smin v5.4s, v5.4s, v21.4s + smin v6.4s, v6.4s, v21.4s + + // Narrow and clamp to 0 + sqxtun v23.4h, v3.4s + sqxtun2 v23.8h, v4.4s + sqxtun v24.4h, v5.4s + sqxtun2 v24.8h, v6.4s + + cbz w5, 3f // Check if big en= dian + rev16 v23.16b, v23.16b + rev16 v24.16b, v24.16b // Swap bits for b= ig endian +3: + st1 {v23.8h, v24.8h}, [x3], #32 + + subs w4, w4, #16 // dstW =3D dstW -= 16 + add x7, x7, #16 // i =3D i + 16 + b 1b // Continue loop + +4: + cmp w4, #8 // Process 8-pixel= s if available + blt 8f +5: + mov v3.16b, v1.16b + mov v4.16b, v2.16b + + mov w11, w1 // tmpfilterSize = =3D filterSize + mov x12, x2 // srcp =3D src + mov x13, x0 // filterp =3D fil= ter + +6: // Filter loop + + ldp x14, x15, [x12], #16 + ldr s7, [x13], #4 + add x14, x14, x7, lsl #1 + add x15, x15, x7, lsl #1 + ld1 {v5.8h}, [x14] + ld1 {v6.8h}, [x15] + + // Multiply-accumulate + smlal v3.4s, v5.4h, v7.h[0] + smlal2 v4.4s, v5.8h, v7.h[0] + smlal v3.4s, v6.4h, v7.h[1] + smlal2 v4.4s, v6.8h, v7.h[1] + + subs w11, w11, #2 // tmpfilterSize -= =3D 2 + b.gt 6b // loop until filt= erSize consumed + + // Shift results + sshl v3.4s, v3.4s, v20.4s + sshl v4.4s, v4.4s, v20.4s + + // Clip upper bound + smin v3.4s, v3.4s, v21.4s + smin v4.4s, v4.4s, v21.4s + + // Narrow and clamp to 0 + sqxtun v25.4h, v3.4s + sqxtun v26.4h, v4.4s + + cbz w5, 7f // Check if big en= dian + rev16 v25.8b, v25.8b + rev16 v26.8b, v26.8b // Swap bits for b= ig endian + +7: + // Store 8 pixels + st1 {v25.4h, v26.4h}, [x3], #16 + + subs w4, w4, #8 // dstW =3D dstW -= 8 + add x7, x7, #8 // i =3D i + 8 + +8: + cbz w4, 12f // Scalar loop for= remaining pixels +9: + mov w11, w1 // tmpfilterSize = =3D filterSize + mov x12, x2 // srcp =3D src + mov x13, x0 // filterp =3D fil= ter + sxtw x9, w9 + mov x17, x9 + +10: // Filter loop + ldr x14, [x12], #8 // Load src pointe= r + ldrsh w15, [x13], #2 // Load filter coe= fficient + add x14, x14, x7, lsl #1 // Add pixel offse= t + ldrh w16, [x14] + + sxtw x16, w16 + sxtw x15, w15 + madd x17, x16, x15, x17 + + subs w11, w11, #1 // tmpfilterSize -= =3D 1 + b.gt 10b // loop until filt= erSize consumed + + sxtw x8, w8 + asr x17, x17, x8 + cmp x17, #0 + csel x17, x17, xzr, ge // Clamp to 0 if n= egative + + sxtw x10, w10 + cmp x17, x10 + csel x17, x10, x17, gt // Clamp to max if= greater than max + + cbz w5, 11f // Check if big en= dian + rev16 x17, x17 // Swap bits for b= ig endian +11: + strh w17, [x3], #2 + + subs w4, w4, #1 // dstW =3D dstW -= 1 + add x7, x7, #1 // i =3D i + 1 + b.gt 9b // Loop if more pi= xels + +12: + ret +endfunc + function ff_yuv2planeX_8_neon, export=3D1 // x0 - const int16_t *filter, // x1 - int filterSize, diff --git a/libswscale/aarch64/swscale.c b/libswscale/aarch64/swscale.c index 6e5a721c1f..2c3f096a84 100644 --- a/libswscale/aarch64/swscale.c +++ b/libswscale/aarch64/swscale.c @@ -158,6 +158,29 @@ void ff_hscale ## from_bpc ## to ## to_bpc ## _ ## fil= ter_n ## _ ## opt( \ ALL_SCALE_FUNCS(neon); +void ff_yuv2planeX_10_neon(const int16_t *filter, int filterSize, + const int16_t **src, uint16_t *dest, int dstW, + int big_endian, int output_bits); + +#define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) = \ +static void yuv2planeX_ ## bits ## BE_LE ## _neon(const int16_t *filter, i= nt filterSize, \ + const int16_t **src, uin= t8_t *dest, int dstW, \ + const uint8_t *dither, i= nt offset) \ +{ = \ + ff_yuv2planeX_## template_size ## _neon(filter, = \ + filterSize, (const typeX_t **)= src, \ + (uint16_t *) dest, dstW, is_be= , bits); \ +} + +yuv2NBPS( 9, BE, 1, 10, int16_t) +yuv2NBPS( 9, LE, 0, 10, int16_t) +yuv2NBPS(10, BE, 1, 10, int16_t) +yuv2NBPS(10, LE, 0, 10, int16_t) +yuv2NBPS(12, BE, 1, 10, int16_t) +yuv2NBPS(12, LE, 0, 10, int16_t) +yuv2NBPS(14, BE, 1, 10, int16_t) +yuv2NBPS(14, LE, 0, 10, int16_t) + void ff_yuv2planeX_8_neon(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset); @@ -268,6 +291,8 @@ av_cold void ff_sws_init_range_convert_aarch64(SwsInter= nal *c) av_cold void ff_sws_init_swscale_aarch64(SwsInternal *c) { int cpu_flags =3D av_get_cpu_flags(); + enum AVPixelFormat dstFormat =3D c->opts.dst_format; + const AVPixFmtDescriptor *desc =3D av_pix_fmt_desc_get(dstFormat); if (have_neon(cpu_flags)) { ASSIGN_SCALE_FUNC(c->hyScale, c->hLumFilterSize, neon); @@ -276,6 +301,19 @@ av_cold void ff_sws_init_swscale_aarch64(SwsInternal *= c) if (c->dstBpc =3D=3D 8) { c->yuv2planeX =3D ff_yuv2planeX_8_neon; } + + if (isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat)) { + if (desc->comp[0].depth =3D=3D 9) { + c->yuv2planeX =3D isBE(dstFormat) ? yuv2planeX_9BE_neon := yuv2planeX_9LE_neon; + } else if (desc->comp[0].depth =3D=3D 10) { + c->yuv2planeX =3D isBE(dstFormat) ? yuv2planeX_10BE_neon = : yuv2planeX_10LE_neon; + } else if (desc->comp[0].depth =3D=3D 12) { + c->yuv2planeX =3D isBE(dstFormat) ? yuv2planeX_12BE_neon = : yuv2planeX_12LE_neon; + } else if (desc->comp[0].depth =3D=3D 14) { + c->yuv2planeX =3D isBE(dstFormat) ? yuv2planeX_14BE_neon = : yuv2planeX_14LE_neon; + } else + av_assert0(0); + } switch (c->opts.src_format) { case AV_PIX_FMT_ABGR: c->lumToYV12 =3D ff_abgr32ToY_neon; diff --git a/tests/checkasm/sw_scale.c b/tests/checkasm/sw_scale.c index 11c9174a6b..5a659571df 100644 --- a/tests/checkasm/sw_scale.c +++ b/tests/checkasm/sw_scale.c @@ -52,50 +52,59 @@ static void yuv2planeX_8_ref(const int16_t *filter, int= filterSize, } } -static int cmp_off_by_n(const uint8_t *ref, const uint8_t *test, size_t n,= int accuracy) -{ - for (size_t i =3D 0; i < n; i++) { - if (abs(ref[i] - test[i]) > accuracy) - return 1; - } - return 0; +#define CMP_FUNC(bits) = \ +static int cmp_off_by_##bits(const uint##bits##_t *ref, const uint##bits##= _t *test, \ + size_t n, int accuracy) = \ +{ = \ + for (size_t i =3D 0; i < n; i++) { = \ + if (abs((int)ref[i] - (int)test[i]) > accuracy) = \ + return 1; = \ + } = \ + return 0; = \ } -static void print_data(uint8_t *p, size_t len, size_t offset) -{ - size_t i =3D 0; - for (; i < len; i++) { - if (i % 8 =3D=3D 0) { - printf("0x%04zx: ", i+offset); - } - printf("0x%02x ", (uint32_t) p[i]); - if (i % 8 =3D=3D 7) { - printf("\n"); - } - } - if (i % 8 !=3D 0) { - printf("\n"); - } +CMP_FUNC(8) +CMP_FUNC(16) + +#define SHOW_DIFF_FUNC(bits) = \ +static void print_data_##bits(const uint##bits##_t *p, size_t len, size_t = offset) \ +{ = \ + size_t i =3D 0; = \ + for (; i < len; i++) { = \ + if (i % 8 =3D=3D 0) { = \ + printf("0x%04zx: ", i+offset); = \ + } = \ + printf("0x%02x ", (uint32_t) p[i]); = \ + if (i % 8 =3D=3D 7) { = \ + printf("\n"); = \ + } = \ + } = \ + if (i % 8 !=3D 0) { = \ + printf("\n"); = \ + } = \ +} = \ +static size_t show_differences_##bits(const uint##bits##_t *a, const uint#= #bits##_t *b, \ + size_t len) = \ +{ = \ + for (size_t i =3D 0; i < len; i++) { = \ + if (a[i] !=3D b[i]) { = \ + size_t offset_of_mismatch =3D i; = \ + size_t offset; = \ + if (i >=3D 8) i-=3D8; = \ + offset =3D i & (~7); = \ + printf("test a:\n"); = \ + print_data_##bits(&a[offset], 32, offset); = \ + printf("\ntest b:\n"); = \ + print_data_##bits(&b[offset], 32, offset); = \ + printf("\n"); = \ + return offset_of_mismatch; = \ + } = \ + } = \ + return len; = \ } -static size_t show_differences(uint8_t *a, uint8_t *b, size_t len) -{ - for (size_t i =3D 0; i < len; i++) { - if (a[i] !=3D b[i]) { - size_t offset_of_mismatch =3D i; - size_t offset; - if (i >=3D 8) i-=3D8; - offset =3D i & (~7); - printf("test a:\n"); - print_data(&a[offset], 32, offset); - printf("\ntest b:\n"); - print_data(&b[offset], 32, offset); - printf("\n"); - return offset_of_mismatch; - } - } - return len; -} +SHOW_DIFF_FUNC(8) +SHOW_DIFF_FUNC(16) static void check_yuv2yuv1(int accurate) { @@ -140,10 +149,10 @@ static void check_yuv2yuv1(int accurate) call_ref(src_pixels, dst0, dstW, dither, offset); call_new(src_pixels, dst1, dstW, dither, offset); - if (cmp_off_by_n(dst0, dst1, dstW * sizeof(dst0[0]), accur= ate ? 0 : 2)) { + if (cmp_off_by_8(dst0, dst1, dstW * sizeof(dst0[0]), accur= ate ? 0 : 2)) { fail(); printf("failed: yuv2yuv1_%d_%di_%s\n", offset, dstW, a= ccurate_str); - fail_offset =3D show_differences(dst0, dst1, LARGEST_I= NPUT_SIZE * sizeof(dst0[0])); + fail_offset =3D show_differences_8(dst0, dst1, LARGEST= _INPUT_SIZE * sizeof(dst0[0])); printf("failing values: src: 0x%04x dither: 0x%02x dst= -c: %02x dst-asm: %02x\n", (int) src_pixels[fail_offset], (int) dither[(fail_offset + fail_offset) & 7], @@ -158,7 +167,7 @@ static void check_yuv2yuv1(int accurate) sws_freeContext(sws); } -static void check_yuv2yuvX(int accurate) +static void check_yuv2yuvX(int accurate, int bit_depth, int dst_pix_format= ) { SwsContext *sws; SwsInternal *c; @@ -179,8 +188,8 @@ static void check_yuv2yuvX(int accurate) const int16_t **src; LOCAL_ALIGNED_16(int16_t, src_pixels, [LARGEST_FILTER * LARGEST_INPUT_= SIZE]); LOCAL_ALIGNED_16(int16_t, filter_coeff, [LARGEST_FILTER]); - LOCAL_ALIGNED_16(uint8_t, dst0, [LARGEST_INPUT_SIZE]); - LOCAL_ALIGNED_16(uint8_t, dst1, [LARGEST_INPUT_SIZE]); + LOCAL_ALIGNED_16(uint16_t, dst0, [LARGEST_INPUT_SIZE]); + LOCAL_ALIGNED_16(uint16_t, dst1, [LARGEST_INPUT_SIZE]); LOCAL_ALIGNED_16(uint8_t, dither, [LARGEST_INPUT_SIZE]); union VFilterData{ const int16_t *src; @@ -190,12 +199,14 @@ static void check_yuv2yuvX(int accurate) memset(dither, d_val, LARGEST_INPUT_SIZE); randomize_buffers((uint8_t*)src_pixels, LARGEST_FILTER * LARGEST_INPUT= _SIZE * sizeof(int16_t)); sws =3D sws_alloc_context(); + sws->dst_format =3D dst_pix_format; if (accurate) sws->flags |=3D SWS_ACCURATE_RND; if (sws_init_context(sws, NULL, NULL) < 0) fail(); c =3D sws_internal(sws); + c->dstBpc =3D bit_depth; ff_sws_init_scale(c); for(isi =3D 0; isi < FF_ARRAY_ELEMS(input_sizes); ++isi){ dstW =3D input_sizes[isi]; @@ -227,24 +238,39 @@ static void check_yuv2yuvX(int accurate) for(j =3D 0; j < 4; ++j) vFilterData[i].coeff[j + 4] =3D filter_coeff[i]; } - if (check_func(c->yuv2planeX, "yuv2yuvX_%d_%d_%d_%s", filt= er_sizes[fsi], osi, dstW, accurate_str)){ + if (check_func(c->yuv2planeX, "yuv2yuvX_%d_%s_%d_%d_%d_%s"= , bit_depth, isBE(dst_pix_format) ? "BE" : "LE", filter_sizes[fsi], osi, ds= tW, accurate_str)){ // use vFilterData for the mmx function const int16_t *filter =3D c->use_mmx_vfilter ? (const = int16_t*)vFilterData : &filter_coeff[0]; memset(dst0, 0, LARGEST_INPUT_SIZE * sizeof(dst0[0])); memset(dst1, 0, LARGEST_INPUT_SIZE * sizeof(dst1[0])); - // We can't use call_ref here, because we don't know i= f use_mmx_vfilter was set for that - // function or not, so we can't pass it the parameters= correctly. - yuv2planeX_8_ref(&filter_coeff[0], filter_sizes[fsi], = src, dst0, dstW - osi, dither, osi); + if(c->dstBpc =3D=3D 8) + { + // We can't use call_ref here, because we don't kn= ow if use_mmx_vfilter was set for that + // function or not, so we can't pass it the parame= ters correctly. - call_new(filter, filter_sizes[fsi], src, dst1, dstW - = osi, dither, osi); - if (cmp_off_by_n(dst0, dst1, LARGEST_INPUT_SIZE * size= of(dst0[0]), accurate ? 0 : 2)) { - fail(); - printf("failed: yuv2yuvX_%d_%d_%d_%s\n", filter_si= zes[fsi], osi, dstW, accurate_str); - show_differences(dst0, dst1, LARGEST_INPUT_SIZE * = sizeof(dst0[0])); + yuv2planeX_8_ref(&filter_coeff[0], filter_sizes[fs= i], src, (uint8_t*)dst0, dstW - osi, dither, osi); + call_new(filter, filter_sizes[fsi], src, (uint8_t*= )dst1, dstW - osi, dither, osi); + + if (cmp_off_by_8((uint8_t*)dst0, (uint8_t*)dst1, L= ARGEST_INPUT_SIZE, accurate ? 0 : 2)) { + fail(); + printf("failed: yuv2yuvX_%d_%s_%d_%d_%d_%s\n",= bit_depth, isBE(dst_pix_format) ? "BE" : "LE", filter_sizes[fsi], osi, dst= W, accurate_str); + show_differences_8((uint8_t*)dst0, (uint8_t*)d= st1, LARGEST_INPUT_SIZE); + } + } + else + { + call_ref(&filter_coeff[0], filter_sizes[fsi], src,= (uint8_t*)dst0, dstW - osi, dither, osi); + call_new(&filter_coeff[0], filter_sizes[fsi], src,= (uint8_t*)dst1, dstW - osi, dither, osi); + + if (cmp_off_by_16(dst0, dst1, LARGEST_INPUT_SIZE, = accurate ? 0 : 2)) { + fail(); + printf("failed: yuv2yuvX_%d_%s_%d_%d_%d_%s\n",= bit_depth, isBE(dst_pix_format) ? "BE" : "LE", filter_sizes[fsi], osi, dst= W, accurate_str); + show_differences_16(dst0, dst1, LARGEST_INPUT_= SIZE); + } } if(dstW =3D=3D LARGEST_INPUT_SIZE) - bench_new((const int16_t*)vFilterData, filter_size= s[fsi], src, dst1, dstW - osi, dither, osi); + bench_new(filter, filter_sizes[fsi], src, (uint8_t= *)dst1, dstW - osi, dither, osi); } av_freep(&src); @@ -311,10 +337,10 @@ static void check_yuv2nv12cX(int accurate) call_ref(sws->dst_format, dither, &filter_coeff[0], filter= _size, srcU, srcV, dst0, dstW); call_new(sws->dst_format, dither, &filter_coeff[0], filter= _size, srcU, srcV, dst1, dstW); - if (cmp_off_by_n(dst0, dst1, dstW * 2 * sizeof(dst0[0]), a= ccurate ? 0 : 2)) { + if (cmp_off_by_8(dst0, dst1, dstW * 2 * sizeof(dst0[0]), a= ccurate ? 0 : 2)) { fail(); printf("failed: yuv2nv12wX_%d_%d_%s\n", filter_size, d= stW, accurate_str); - show_differences(dst0, dst1, dstW * 2 * sizeof(dst0[0]= )); + show_differences_8(dst0, dst1, dstW * 2 * sizeof(dst0[= 0])); } if (dstW =3D=3D LARGEST_INPUT_SIZE) bench_new(sws->dst_format, dither, &filter_coeff[0], f= ilter_size, srcU, srcV, dst1, dstW); @@ -441,9 +467,33 @@ void checkasm_check_sw_scale(void) check_yuv2yuv1(0); check_yuv2yuv1(1); report("yuv2yuv1"); - check_yuv2yuvX(0); - check_yuv2yuvX(1); - report("yuv2yuvX"); + check_yuv2yuvX(0, 8, AV_PIX_FMT_YUV420P); + check_yuv2yuvX(1, 8, AV_PIX_FMT_YUV420P); + report("yuv2yuvX_8"); + check_yuv2yuvX(0, 9, AV_PIX_FMT_YUV420P9LE); + check_yuv2yuvX(1, 9, AV_PIX_FMT_YUV420P9LE); + report("yuv2yuvX_9LE"); + check_yuv2yuvX(0, 9, AV_PIX_FMT_YUV420P9BE); + check_yuv2yuvX(1, 9, AV_PIX_FMT_YUV420P9BE); + report("yuv2yuvX_9BE"); + check_yuv2yuvX(0, 10, AV_PIX_FMT_YUV420P10LE); + check_yuv2yuvX(1, 10, AV_PIX_FMT_YUV420P10LE); + report("yuv2yuvX_10LE"); + check_yuv2yuvX(0, 10, AV_PIX_FMT_YUV420P10BE); + check_yuv2yuvX(1, 10, AV_PIX_FMT_YUV420P10BE); + report("yuv2yuvX_10BE"); + check_yuv2yuvX(0, 12, AV_PIX_FMT_YUV420P12LE); + check_yuv2yuvX(1, 12, AV_PIX_FMT_YUV420P12LE); + report("yuv2yuvX_12LE"); + check_yuv2yuvX(0, 12, AV_PIX_FMT_YUV420P12BE); + check_yuv2yuvX(1, 12, AV_PIX_FMT_YUV420P12BE); + report("yuv2yuvX_12BE"); + check_yuv2yuvX(0, 14, AV_PIX_FMT_YUV420P14LE); + check_yuv2yuvX(1, 14, AV_PIX_FMT_YUV420P14LE); + report("yuv2yuvX_14LE"); + check_yuv2yuvX(0, 14, AV_PIX_FMT_YUV420P14BE); + check_yuv2yuvX(1, 14, AV_PIX_FMT_YUV420P14BE); + report("yuv2yuvX_14BE"); check_yuv2nv12cX(0); check_yuv2nv12cX(1); report("yuv2nv12cX"); -- 2.34.1 --_004_PN3P287MB3339E53168F261F6CCCF13B79A57APN3P287MB3339INDP_ Content-Type: application/octet-stream; name="Swscale-Aarch64-Implement-neon-assembly-yuv2planeX_10_c_template.patch" Content-Description: Swscale-Aarch64-Implement-neon-assembly-yuv2planeX_10_c_template.patch Content-Disposition: attachment; filename="Swscale-Aarch64-Implement-neon-assembly-yuv2planeX_10_c_template.patch"; size=25716; creation-date="Tue, 15 Jul 2025 04:58:24 GMT"; modification-date="Tue, 15 Jul 2025 04:58:49 GMT" Content-Transfer-Encoding: base64 RnJvbSAzZTE0YjRjMmU3NjNkMmQwYzg5NzllM2U5OTU3OGY1NDkyYjcxMzBjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMb2dhcHJha2FzaCBSYW1hamF5YW0gPGxvZ2FwcmFrYXNoLnJh bWFqYXlhbUBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KRGF0ZTogVHVlLCAxIEp1bCAyMDI1IDIzOjQ4 OjM2IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2MiAxLzFdIHN3c2NhbGUvYWFyY2g2NC9vdXRwdXQ6 IEltcGxlbWVudCBuZW9uIGFzc2VtYmx5IGZvciB5dXYycGxhbmVYXzEwX2NfdGVtcGxhdGUoKQoK LS0tCiBsaWJzd3NjYWxlL2FhcmNoNjQvb3V0cHV0LlMgIHwgMTg5ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCiBsaWJzd3NjYWxlL2FhcmNoNjQvc3dzY2FsZS5jIHwgIDM4ICsr KysrKysKIHRlc3RzL2NoZWNrYXNtL3N3X3NjYWxlLmMgICAgfCAxNzAgKysrKysrKysrKysrKysr KysrKystLS0tLS0tLS0tLQogMyBmaWxlcyBjaGFuZ2VkLCAzMzcgaW5zZXJ0aW9ucygrKSwgNjAg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9hYXJjaDY0L291dHB1dC5TIGIv bGlic3dzY2FsZS9hYXJjaDY0L291dHB1dC5TCmluZGV4IDE5MGM0Mzg4NzAuLjJhYWQ0MjBkYjIg MTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvYWFyY2g2NC9vdXRwdXQuUworKysgYi9saWJzd3NjYWxl L2FhcmNoNjQvb3V0cHV0LlMKQEAgLTIwLDYgKzIwLDE5NSBAQAogCiAjaW5jbHVkZSAibGliYXZ1 dGlsL2FhcmNoNjQvYXNtLlMiCiAKK2Z1bmN0aW9uIGZmX3l1djJwbGFuZVhfMTBfbmVvbiwgZXhw b3J0PTEKKy8vIHgwID0gZmlsdGVyIChpbnQxNl90KikKKy8vIHcxID0gZmlsdGVyU2l6ZQorLy8g eDIgPSBzcmMgKGludDE2X3QqKikKKy8vIHgzID0gZGVzdCAodWludDE2X3QqKQorLy8gdzQgPSBk c3RXCisvLyB3NSA9IGJpZ19lbmRpYW4KKy8vIHc2ID0gb3V0cHV0X2JpdHMKKworICAgICAgICBt b3YgICAgICAgICAgICAgdzgsICMyNworICAgICAgICBzdWIgICAgICAgICAgICAgdzgsIHc4LCB3 NiAgICAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCA9IDExICsgMTYgLSBvdXRwdXRfYml0cwor CisgICAgICAgIHN1YiAgICAgICAgICAgICB3OSwgdzgsICMxCisgICAgICAgIG1vdiAgICAgICAg ICAgICB3MTAsICMxCisgICAgICAgIGxzbCAgICAgICAgICAgICB3OSwgdzEwLCB3OSAgICAgICAg ICAgICAgICAgICAgIC8vIHZhbCA9IDEgPDwgKHNoaWZ0IC0gMSkKKworICAgICAgICBkdXAgICAg ICAgICAgICAgdjEuNHMsIHc5CisgICAgICAgIGR1cCAgICAgICAgICAgICB2Mi40cywgdzkgICAg ICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB2ZWN0b3JzIHdpdGggdmFsCisKKyAgICAgICAg bmVnICAgICAgICAgICAgIHcxNiwgdzgKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyMC40cywg dzE2ICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlICgtc2hpZnQpIHZlY3RvciBmb3Igcmln aHQgc2hpZnQKKworICAgICAgICBtb3YgICAgICAgICAgICAgdzEwLCAjMQorICAgICAgICBsc2wg ICAgICAgICAgICAgdzEwLCB3MTAsIHc2CisgICAgICAgIHN1YiAgICAgICAgICAgICB3MTAsIHcx MCwgIzEgICAgICAgICAgICAgICAgICAgIC8vICgxVSA8PCBvdXRwdXRfYml0cykgLSAxCisgICAg ICAgIGR1cCAgICAgICAgICAgICB2MjEuNHMsIHcxMCAgICAgICAgICAgICAgICAgICAgIC8vIENy ZWF0ZSBDbGlwIHZlY3RvciBmb3IgdXBwZXIgYm91bmQKKworICAgICAgICBtb3YgICAgICAgICAg ICAgeDcsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpID0gMAorCisxOgorICAgICAg ICBjbXAgICAgICAgICAgICAgdzQsICMxNiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9j ZXNzIDE2LXBpeGVscyBpZiBhdmFpbGFibGUKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDRmCisK KyAgICAgICAgbW92ICAgICAgICAgICAgIHYzLjE2YiwgdjEuMTZiCisgICAgICAgIG1vdiAgICAg ICAgICAgICB2NC4xNmIsIHYyLjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjUuMTZiLCB2 MS4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY2LjE2YiwgdjIuMTZiCisKKyAgICAgICAg bW92ICAgICAgICAgICAgIHcxMSwgdzEgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG1wZmls dGVyU2l6ZSA9IGZpbHRlclNpemUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgeDIgICAg ICAgICAgICAgICAgICAgICAgICAgLy8gc3JjcCA9IHNyYworICAgICAgICBtb3YgICAgICAgICAg ICAgeDEzLCB4MCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXJwID0gZmlsdGVyCisK KzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ly8gRmlsdGVyIGxvb3AKKworICAgICAgICBsZHAgICAgICAgICAgICAgeDE0LCB4MTUsIFt4MTJd LCAjMTYgICAgICAgICAgICAvLyBnZXQgMiBwb2ludGVyczogc3JjW2pdIGFuZCBzcmNbaisxXQor ICAgICAgICBsZHIgICAgICAgICAgICAgczcsIFt4MTNdLCAjNCAgICAgICAgICAgICAgICAgICAv LyBsb2FkIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxNCwg eDE0LCB4NywgbHNsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MTUsIHgxNSwgeDcsIGxz bCAjMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44aCwgdjE3LjhofSwgW3gxNF0KKyAg ICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGgsIHYxOS44aH0sIFt4MTVdCisKKyAgICAgICAg Ly8gTXVsdGlwbHktYWNjdW11bGF0ZQorICAgICAgICBzbWxhbCAgICAgICAgICAgdjMuNHMsICB2 MTYuNGgsIHY3LmhbMF0KKyAgICAgICAgc21sYWwyICAgICAgICAgIHY0LjRzLCAgdjE2LjhoLCB2 Ny5oWzBdCisgICAgICAgIHNtbGFsICAgICAgICAgICB2NS40cywgIHYxNy40aCwgdjcuaFswXQor ICAgICAgICBzbWxhbDIgICAgICAgICAgdjYuNHMsICB2MTcuOGgsIHY3LmhbMF0KKworICAgICAg ICBzbWxhbCAgICAgICAgICAgdjMuNHMsICB2MTguNGgsIHY3LmhbMV0KKyAgICAgICAgc21sYWwy ICAgICAgICAgIHY0LjRzLCAgdjE4LjhoLCB2Ny5oWzFdCisgICAgICAgIHNtbGFsICAgICAgICAg ICB2NS40cywgIHYxOS40aCwgdjcuaFsxXQorICAgICAgICBzbWxhbDIgICAgICAgICAgdjYuNHMs ICB2MTkuOGgsIHY3LmhbMV0KKworICAgICAgICBzdWJzICAgICAgICAgICAgdzExLCB3MTEsICMy ICAgICAgICAgICAgICAgICAgICAvLyB0bXBmaWx0ZXJTaXplIC09IDIKKyAgICAgICAgYi5ndCAg ICAgICAgICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgZmls dGVyIGxvb3AKKworICAgICAgICAvLyBTaGlmdCByZXN1bHRzCisgICAgICAgIHNzaGwgICAgICAg ICAgICB2My40cywgIHYzLjRzLCB2MjAuNHMKKyAgICAgICAgc3NobCAgICAgICAgICAgIHY0LjRz LCAgdjQuNHMsIHYyMC40cworICAgICAgICBzc2hsICAgICAgICAgICAgdjUuNHMsICB2NS40cywg djIwLjRzCisgICAgICAgIHNzaGwgICAgICAgICAgICB2Ni40cywgIHY2LjRzLCB2MjAuNHMKKwor ICAgICAgICAvLyBDbGFtcCB0byB1cHBlciBib3VuZAorICAgICAgICBzbWluICAgICAgICAgICAg djMuNHMsICB2My40cywgdjIxLjRzCisgICAgICAgIHNtaW4gICAgICAgICAgICB2NC40cywgIHY0 LjRzLCB2MjEuNHMKKyAgICAgICAgc21pbiAgICAgICAgICAgIHY1LjRzLCAgdjUuNHMsIHYyMS40 cworICAgICAgICBzbWluICAgICAgICAgICAgdjYuNHMsICB2Ni40cywgdjIxLjRzCisKKyAgICAg ICAgLy8gTmFycm93IGFuZCBjbGFtcCB0byAwCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjMu NGgsIHYzLjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2MjMuOGgsIHY0LjRzCisgICAgICAg IHNxeHR1biAgICAgICAgICB2MjQuNGgsIHY1LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2 MjQuOGgsIHY2LjRzCisKKyAgICAgICAgY2J6ICAgICAgICAgICAgIHc1LCAzZiAgICAgICAgICAg ICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmlnIGVuZGlhbgorICAgICAgICByZXYxNiAgICAg ICAgICAgdjIzLjE2YiwgdjIzLjE2YgorICAgICAgICByZXYxNiAgICAgICAgICAgdjI0LjE2Yiwg djI0LjE2YiAgICAgICAgICAgICAgICAvLyBTd2FwIGJpdHMgZm9yIGJpZyBlbmRpYW4KKzM6Cisg ICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhoLCB2MjQuOGh9LCBbeDNdLCAjMzIKKworICAg ICAgICBzdWJzICAgICAgICAgICAgdzQsIHc0LCAjMTYgICAgICAgICAgICAgICAgICAgICAvLyBk c3RXID0gZHN0VyAtIDE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4NywgeDcsICMxNiAgICAg ICAgICAgICAgICAgICAgIC8vIGkgPSBpICsgMTYKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFi ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgbG9vcAorCis0OgorICAg ICAgICBjbXAgICAgICAgICAgICAgdzQsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQ cm9jZXNzIDgtcGl4ZWxzIGlmIGF2YWlsYWJsZQorICAgICAgICBibHQgICAgICAgICAgICAgOGYK KzU6CisgICAgICAgIG1vdiAgICAgICAgICAgICB2My4xNmIsIHYxLjE2YgorICAgICAgICBtb3Yg ICAgICAgICAgICAgdjQuMTZiLCB2Mi4xNmIKKworICAgICAgICBtb3YgICAgICAgICAgICAgdzEx LCB3MSAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0bXBmaWx0ZXJTaXplID0gZmlsdGVyU2l6 ZQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB4MiAgICAgICAgICAgICAgICAgICAgICAg ICAvLyBzcmNwID0gc3JjCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsIHgwICAgICAgICAg ICAgICAgICAgICAgICAgIC8vIGZpbHRlcnAgPSBmaWx0ZXIKKworNjogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgbG9vcAorCisg ICAgICAgIGxkcCAgICAgICAgICAgICB4MTQsIHgxNSwgW3gxMl0sICMxNgorICAgICAgICBsZHIg ICAgICAgICAgICAgczcsIFt4MTNdLCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDE0LCB4 MTQsIHg3LCBsc2wgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxNSwgeDE1LCB4NywgbHNs ICMxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOGh9LCBbeDE0XQorICAgICAgICBsZDEg ICAgICAgICAgICAge3Y2LjhofSwgW3gxNV0KKworICAgICAgICAvLyBNdWx0aXBseS1hY2N1bXVs YXRlCisgICAgICAgIHNtbGFsICAgICAgICAgICB2My40cywgdjUuNGgsIHY3LmhbMF0KKyAgICAg ICAgc21sYWwyICAgICAgICAgIHY0LjRzLCB2NS44aCwgdjcuaFswXQorICAgICAgICBzbWxhbCAg ICAgICAgICAgdjMuNHMsIHY2LjRoLCB2Ny5oWzFdCisgICAgICAgIHNtbGFsMiAgICAgICAgICB2 NC40cywgdjYuOGgsIHY3LmhbMV0KKworICAgICAgICBzdWJzICAgICAgICAgICAgdzExLCB3MTEs ICMyICAgICAgICAgICAgICAgICAgICAvLyB0bXBmaWx0ZXJTaXplIC09IDIKKyAgICAgICAgYi5n dCAgICAgICAgICAgIDZiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB1bnRp bCBmaWx0ZXJTaXplIGNvbnN1bWVkCisKKyAgICAgICAgLy8gU2hpZnQgcmVzdWx0cworICAgICAg ICBzc2hsICAgICAgICAgICAgdjMuNHMsIHYzLjRzLCB2MjAuNHMKKyAgICAgICAgc3NobCAgICAg ICAgICAgIHY0LjRzLCB2NC40cywgdjIwLjRzCisKKyAgICAgICAgLy8gQ2xpcCB1cHBlciBib3Vu ZAorICAgICAgICBzbWluICAgICAgICAgICAgdjMuNHMsIHYzLjRzLCB2MjEuNHMKKyAgICAgICAg c21pbiAgICAgICAgICAgIHY0LjRzLCB2NC40cywgdjIxLjRzCisKKyAgICAgICAgLy8gTmFycm93 IGFuZCBjbGFtcCB0byAwCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjUuNGgsIHYzLjRzCisg ICAgICAgIHNxeHR1biAgICAgICAgICB2MjYuNGgsIHY0LjRzCisKKyAgICAgICAgY2J6ICAgICAg ICAgICAgIHc1LCA3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmlnIGVu ZGlhbgorICAgICAgICByZXYxNiAgICAgICAgICAgdjI1LjhiLCB2MjUuOGIKKyAgICAgICAgcmV2 MTYgICAgICAgICAgIHYyNi44YiwgdjI2LjhiICAgICAgICAgICAgICAgICAgLy8gU3dhcCBiaXRz IGZvciBiaWcgZW5kaWFuCisKKzc6CisgICAgICAgIC8vIFN0b3JlIDggcGl4ZWxzCisgICAgICAg IHN0MSAgICAgICAgICAgICB7djI1LjRoLCB2MjYuNGh9LCBbeDNdLCAjMTYKKworICAgICAgICBz dWJzICAgICAgICAgICAgdzQsIHc0LCAjOCAgICAgICAgICAgICAgICAgICAgICAvLyBkc3RXID0g ZHN0VyAtIDgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg3LCB4NywgIzggICAgICAgICAgICAg ICAgICAgICAgLy8gaSA9IGkgKyA4CisKKzg6CisgICAgICAgIGNieiAgICAgICAgICAgICB3NCwg MTJmICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxhciBsb29wIGZvciByZW1haW5pbmcg cGl4ZWxzCis5OgorICAgICAgICBtb3YgICAgICAgICAgICAgdzExLCB3MSAgICAgICAgICAgICAg ICAgICAgICAgICAvLyB0bXBmaWx0ZXJTaXplID0gZmlsdGVyU2l6ZQorICAgICAgICBtb3YgICAg ICAgICAgICAgeDEyLCB4MiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNwID0gc3JjCisg ICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsIHgwICAgICAgICAgICAgICAgICAgICAgICAgIC8v IGZpbHRlcnAgPSBmaWx0ZXIKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHg5LCB3OQorICAgICAg ICBtb3YgICAgICAgICAgICAgeDE3LCB4OQorCisxMDogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBsb29wCisgICAgICAgIGxkciAg ICAgICAgICAgICB4MTQsIFt4MTJdLCAjOCAgICAgICAgICAgICAgICAgIC8vIExvYWQgc3JjIHBv aW50ZXIKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHcxNSwgW3gxM10sICMyICAgICAgICAgICAg ICAgICAgLy8gTG9hZCBmaWx0ZXIgY29lZmZpY2llbnQKKyAgICAgICAgYWRkICAgICAgICAgICAg IHgxNCwgeDE0LCB4NywgbHNsICMxICAgICAgICAgICAgLy8gQWRkIHBpeGVsIG9mZnNldAorICAg ICAgICBsZHJoICAgICAgICAgICAgdzE2LCBbeDE0XQorCisgICAgICAgIHN4dHcgICAgICAgICAg ICB4MTYsIHcxNgorICAgICAgICBzeHR3ICAgICAgICAgICAgeDE1LCB3MTUKKyAgICAgICAgbWFk ZCAgICAgICAgICAgIHgxNywgeDE2LCB4MTUsIHgxNworCisgICAgICAgIHN1YnMgICAgICAgICAg ICB3MTEsIHcxMSwgIzEgICAgICAgICAgICAgICAgICAgIC8vIHRtcGZpbHRlclNpemUgLT0gMQor ICAgICAgICBiLmd0ICAgICAgICAgICAgMTBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv LyBsb29wIHVudGlsIGZpbHRlclNpemUgY29uc3VtZWQKKworICAgICAgICBzeHR3ICAgICAgICAg ICAgeDgsIHc4CisgICAgICAgIGFzciAgICAgICAgICAgICB4MTcsIHgxNywgeDgKKyAgICAgICAg Y21wICAgICAgICAgICAgIHgxNywgIzAKKyAgICAgICAgY3NlbCAgICAgICAgICAgIHgxNywgeDE3 LCB4enIsIGdlICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gMCBpZiBuZWdhdGl2ZQorCisgICAg ICAgIHN4dHcgICAgICAgICAgICB4MTAsIHcxMAorICAgICAgICBjbXAgICAgICAgICAgICAgeDE3 LCB4MTAKKyAgICAgICAgY3NlbCAgICAgICAgICAgIHgxNywgeDEwLCB4MTcsIGd0ICAgICAgICAg ICAgICAgLy8gQ2xhbXAgdG8gbWF4IGlmIGdyZWF0ZXIgdGhhbiBtYXgKKworICAgICAgICBjYnog ICAgICAgICAgICAgdzUsIDExZiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBi aWcgZW5kaWFuCisgICAgICAgIHJldjE2ICAgICAgICAgICB4MTcsIHgxNyAgICAgICAgICAgICAg ICAgICAgICAgIC8vIFN3YXAgYml0cyBmb3IgYmlnIGVuZGlhbgorMTE6CisgICAgICAgIHN0cmgg ICAgICAgICAgICB3MTcsIFt4M10sICMyCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCB3 NCwgIzEgICAgICAgICAgICAgICAgICAgICAgLy8gZHN0VyA9IGRzdFcgLSAxCisgICAgICAgIGFk ZCAgICAgICAgICAgICB4NywgeDcsICMxICAgICAgICAgICAgICAgICAgICAgIC8vIGkgPSBpICsg MQorICAgICAgICBiLmd0ICAgICAgICAgICAgOWIgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAvLyBMb29wIGlmIG1vcmUgcGl4ZWxzCisKKzEyOgorICAgICAgICByZXQKK2VuZGZ1bmMKKwog ZnVuY3Rpb24gZmZfeXV2MnBsYW5lWF84X25lb24sIGV4cG9ydD0xCiAvLyB4MCAtIGNvbnN0IGlu dDE2X3QgKmZpbHRlciwKIC8vIHgxIC0gaW50IGZpbHRlclNpemUsCmRpZmYgLS1naXQgYS9saWJz d3NjYWxlL2FhcmNoNjQvc3dzY2FsZS5jIGIvbGlic3dzY2FsZS9hYXJjaDY0L3N3c2NhbGUuYwpp bmRleCA2ZTVhNzIxYzFmLi4yYzNmMDk2YTg0IDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL2FhcmNo NjQvc3dzY2FsZS5jCisrKyBiL2xpYnN3c2NhbGUvYWFyY2g2NC9zd3NjYWxlLmMKQEAgLTE1OCw2 ICsxNTgsMjkgQEAgdm9pZCBmZl9oc2NhbGUgIyMgZnJvbV9icGMgIyMgdG8gIyMgdG9fYnBjICMj IF8gIyMgZmlsdGVyX24gIyMgXyAjIyBvcHQoIFwKIAogQUxMX1NDQUxFX0ZVTkNTKG5lb24pOwog Cit2b2lkIGZmX3l1djJwbGFuZVhfMTBfbmVvbihjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBm aWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKnNy YywgdWludDE2X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg aW50IGJpZ19lbmRpYW4sIGludCBvdXRwdXRfYml0cyk7CisKKyNkZWZpbmUgeXV2Mk5CUFMoYml0 cywgQkVfTEUsIGlzX2JlLCB0ZW1wbGF0ZV9zaXplLCB0eXBlWF90KSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHl1djJwbGFuZVhfICMjIGJpdHMgIyMg QkVfTEUgIyMgX25lb24oY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwgICAg ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsIFwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAq ZGl0aGVyLCBpbnQgb2Zmc2V0KSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICBmZl95dXYycGxhbmVYXyMjIHRlbXBsYXRlX3NpemUgIyMg X25lb24oZmlsdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU2l6 ZSwgKGNvbnN0IHR5cGVYX3QgKiopIHNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopIGRlc3QsIGRzdFcs IGlzX2JlLCBiaXRzKTsgICAgICAgICAgICAgIFwKK30KKworeXV2Mk5CUFMoIDksIEJFLCAxLCAx MCwgaW50MTZfdCkKK3l1djJOQlBTKCA5LCBMRSwgMCwgMTAsIGludDE2X3QpCit5dXYyTkJQUygx MCwgQkUsIDEsIDEwLCBpbnQxNl90KQoreXV2Mk5CUFMoMTAsIExFLCAwLCAxMCwgaW50MTZfdCkK K3l1djJOQlBTKDEyLCBCRSwgMSwgMTAsIGludDE2X3QpCit5dXYyTkJQUygxMiwgTEUsIDAsIDEw LCBpbnQxNl90KQoreXV2Mk5CUFMoMTQsIEJFLCAxLCAxMCwgaW50MTZfdCkKK3l1djJOQlBTKDE0 LCBMRSwgMCwgMTAsIGludDE2X3QpCisKIHZvaWQgZmZfeXV2MnBsYW5lWF84X25lb24oY29uc3Qg aW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgaW50MTZfdCAqKnNyYywgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCk7CkBA IC0yNjgsNiArMjkxLDggQEAgYXZfY29sZCB2b2lkIGZmX3N3c19pbml0X3JhbmdlX2NvbnZlcnRf YWFyY2g2NChTd3NJbnRlcm5hbCAqYykKIGF2X2NvbGQgdm9pZCBmZl9zd3NfaW5pdF9zd3NjYWxl X2FhcmNoNjQoU3dzSW50ZXJuYWwgKmMpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9j cHVfZmxhZ3MoKTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+b3B0cy5k c3RfZm9ybWF0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9m bXRfZGVzY19nZXQoZHN0Rm9ybWF0KTsKIAogICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkg ewogICAgICAgICBBU1NJR05fU0NBTEVfRlVOQyhjLT5oeVNjYWxlLCBjLT5oTHVtRmlsdGVyU2l6 ZSwgbmVvbik7CkBAIC0yNzYsNiArMzAxLDE5IEBAIGF2X2NvbGQgdm9pZCBmZl9zd3NfaW5pdF9z d3NjYWxlX2FhcmNoNjQoU3dzSW50ZXJuYWwgKmMpCiAgICAgICAgIGlmIChjLT5kc3RCcGMgPT0g OCkgewogICAgICAgICAgICAgYy0+eXV2MnBsYW5lWCA9IGZmX3l1djJwbGFuZVhfOF9uZW9uOwog ICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTkJQUyhkc3RGb3JtYXQpICYmICFpc1NlbWlQbGFu YXJZVVYoZHN0Rm9ybWF0KSkgeworICAgICAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGgg PT0gOSkgeworICAgICAgICAgICAgICAgIGMtPnl1djJwbGFuZVggPSBpc0JFKGRzdEZvcm1hdCkg PyB5dXYycGxhbmVYXzlCRV9uZW9uICA6IHl1djJwbGFuZVhfOUxFX25lb247CisgICAgICAgICAg ICB9IGVsc2UgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gMTApIHsKKyAgICAgICAgICAgICAg ICBjLT55dXYycGxhbmVYID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnBsYW5lWF8xMEJFX25lb24g IDogeXV2MnBsYW5lWF8xMExFX25lb247CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2MtPmNv bXBbMF0uZGVwdGggPT0gMTIpIHsKKyAgICAgICAgICAgICAgICBjLT55dXYycGxhbmVYID0gaXNC RShkc3RGb3JtYXQpID8geXV2MnBsYW5lWF8xMkJFX25lb24gIDogeXV2MnBsYW5lWF8xMkxFX25l b247CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gMTQpIHsK KyAgICAgICAgICAgICAgICBjLT55dXYycGxhbmVYID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnBs YW5lWF8xNEJFX25lb24gIDogeXV2MnBsYW5lWF8xNExFX25lb247CisgICAgICAgICAgICB9IGVs c2UKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CiAgICAgICAgIHN3 aXRjaCAoYy0+b3B0cy5zcmNfZm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdS OgogICAgICAgICAgICAgYy0+bHVtVG9ZVjEyID0gZmZfYWJncjMyVG9ZX25lb247CmRpZmYgLS1n aXQgYS90ZXN0cy9jaGVja2FzbS9zd19zY2FsZS5jIGIvdGVzdHMvY2hlY2thc20vc3dfc2NhbGUu YwppbmRleCAxMWM5MTc0YTZiLi41YTY1OTU3MWRmIDEwMDY0NAotLS0gYS90ZXN0cy9jaGVja2Fz bS9zd19zY2FsZS5jCisrKyBiL3Rlc3RzL2NoZWNrYXNtL3N3X3NjYWxlLmMKQEAgLTUyLDUwICs1 Miw1OSBAQCBzdGF0aWMgdm9pZCB5dXYycGxhbmVYXzhfcmVmKGNvbnN0IGludDE2X3QgKmZpbHRl ciwgaW50IGZpbHRlclNpemUsCiAgICAgfQogfQogCi1zdGF0aWMgaW50IGNtcF9vZmZfYnlfbihj b25zdCB1aW50OF90ICpyZWYsIGNvbnN0IHVpbnQ4X3QgKnRlc3QsIHNpemVfdCBuLCBpbnQgYWNj dXJhY3kpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAg aWYgKGFicyhyZWZbaV0gLSB0ZXN0W2ldKSA+IGFjY3VyYWN5KQotICAgICAgICAgICAgcmV0dXJu IDE7Ci0gICAgfQotICAgIHJldHVybiAwOworI2RlZmluZSBDTVBfRlVOQyhiaXRzKSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCitzdGF0aWMgaW50IGNtcF9vZmZfYnlfIyNiaXRzKGNvbnN0IHVpbnQjI2JpdHMjI190 ICpyZWYsIGNvbnN0IHVpbnQjI2JpdHMjI190ICp0ZXN0LCAgICAgICAgIFwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGludCBhY2N1cmFjeSkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYg KGFicygoaW50KXJlZltpXSAtIChpbnQpdGVzdFtpXSkgPiBhY2N1cmFjeSkgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4g MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi1zdGF0aWMgdm9pZCBwcmludF9kYXRhKHVp bnQ4X3QgKnAsIHNpemVfdCBsZW4sIHNpemVfdCBvZmZzZXQpCi17Ci0gICAgc2l6ZV90IGkgPSAw OwotICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgaWYgKGkgJSA4ID09IDApIHsK LSAgICAgICAgICAgIHByaW50ZigiMHglMDR6eDogIiwgaStvZmZzZXQpOwotICAgICAgICB9Ci0g ICAgICAgIHByaW50ZigiMHglMDJ4ICIsICh1aW50MzJfdCkgcFtpXSk7Ci0gICAgICAgIGlmIChp ICUgOCA9PSA3KSB7Ci0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIH0KLSAgICB9 Ci0gICAgaWYgKGkgJSA4ICE9IDApIHsKLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KK0NN UF9GVU5DKDgpCitDTVBfRlVOQygxNikKKworI2RlZmluZSBTSE9XX0RJRkZfRlVOQyhiaXRzKSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCitzdGF0aWMgdm9pZCBwcmludF9kYXRhXyMjYml0cyhjb25zdCB1aW50IyNiaXRzIyNf dCAqcCwgc2l6ZV90IGxlbiwgc2l6ZV90IG9mZnNldCkgICAgICAgICAgIFwKK3sgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemVfdCBpID0gMDsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgZm9yICg7IGkgPCBsZW47IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYg KGkgJSA4ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHJpbnRmKCIweCUwNHp4OiAi LCBpK29mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJp bnRmKCIweCUwMnggIiwgKHVpbnQzMl90KSBwW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSAlIDggPT0gNykgeyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgaWYgKGkgJSA4ICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJp bnRmKCJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzaXpl X3Qgc2hvd19kaWZmZXJlbmNlc18jI2JpdHMoY29uc3QgdWludCMjYml0cyMjX3QgKmEsIGNvbnN0 IHVpbnQjI2JpdHMjI190ICpiLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzaXplX3QgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNp emVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSB7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X29mX21pc21hdGNoID0gaTsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg IHNpemVfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGkgPj0gOCkgaS09ODsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICBvZmZzZXQgPSBpICYgKH43KTsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg IHByaW50ZigidGVzdCBhOlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHJpbnRfZGF0YV8jI2JpdHMo JmFbb2Zmc2V0XSwgMzIsIG9mZnNldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICBwcmludGYoIlxudGVzdCBiOlxuIik7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg IHByaW50X2RhdGFfIyNiaXRzKCZiW29mZnNldF0sIDMyLCBvZmZzZXQpOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0X29mX21pc21hdGNoOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgcmV0dXJuIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotc3RhdGlj IHNpemVfdCBzaG93X2RpZmZlcmVuY2VzKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHNpemVfdCBs ZW4pCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBp ZiAoYVtpXSAhPSBiW2ldKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X29mX21pc21hdGNo ID0gaTsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoaSA+PSA4 KSBpLT04OwotICAgICAgICAgICAgb2Zmc2V0ID0gaSAmICh+Nyk7Ci0gICAgICAgICAgICBwcmlu dGYoInRlc3QgYTpcbiIpOwotICAgICAgICAgICAgcHJpbnRfZGF0YSgmYVtvZmZzZXRdLCAzMiwg b2Zmc2V0KTsKLSAgICAgICAgICAgIHByaW50ZigiXG50ZXN0IGI6XG4iKTsKLSAgICAgICAgICAg IHByaW50X2RhdGEoJmJbb2Zmc2V0XSwgMzIsIG9mZnNldCk7Ci0gICAgICAgICAgICBwcmludGYo IlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gb2Zmc2V0X29mX21pc21hdGNoOwotICAgICAgICB9 Ci0gICAgfQotICAgIHJldHVybiBsZW47Ci19CitTSE9XX0RJRkZfRlVOQyg4KQorU0hPV19ESUZG X0ZVTkMoMTYpCiAKIHN0YXRpYyB2b2lkIGNoZWNrX3l1djJ5dXYxKGludCBhY2N1cmF0ZSkKIHsK QEAgLTE0MCwxMCArMTQ5LDEwIEBAIHN0YXRpYyB2b2lkIGNoZWNrX3l1djJ5dXYxKGludCBhY2N1 cmF0ZSkKIAogICAgICAgICAgICAgICAgIGNhbGxfcmVmKHNyY19waXhlbHMsIGRzdDAsIGRzdFcs IGRpdGhlciwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICBjYWxsX25ldyhzcmNfcGl4ZWxzLCBk c3QxLCBkc3RXLCBkaXRoZXIsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNtcF9vZmZf Ynlfbihkc3QwLCBkc3QxLCBkc3RXICogc2l6ZW9mKGRzdDBbMF0pLCBhY2N1cmF0ZSA/IDAgOiAy KSkgeworICAgICAgICAgICAgICAgIGlmIChjbXBfb2ZmX2J5XzgoZHN0MCwgZHN0MSwgZHN0VyAq IHNpemVvZihkc3QwWzBdKSwgYWNjdXJhdGUgPyAwIDogMikpIHsKICAgICAgICAgICAgICAgICAg ICAgZmFpbCgpOwogICAgICAgICAgICAgICAgICAgICBwcmludGYoImZhaWxlZDogeXV2Mnl1djFf JWRfJWRpXyVzXG4iLCBvZmZzZXQsIGRzdFcsIGFjY3VyYXRlX3N0cik7Ci0gICAgICAgICAgICAg ICAgICAgIGZhaWxfb2Zmc2V0ID0gc2hvd19kaWZmZXJlbmNlcyhkc3QwLCBkc3QxLCBMQVJHRVNU X0lOUFVUX1NJWkUgKiBzaXplb2YoZHN0MFswXSkpOworICAgICAgICAgICAgICAgICAgICBmYWls X29mZnNldCA9IHNob3dfZGlmZmVyZW5jZXNfOChkc3QwLCBkc3QxLCBMQVJHRVNUX0lOUFVUX1NJ WkUgKiBzaXplb2YoZHN0MFswXSkpOwogICAgICAgICAgICAgICAgICAgICBwcmludGYoImZhaWxp bmcgdmFsdWVzOiBzcmM6IDB4JTA0eCBkaXRoZXI6IDB4JTAyeCBkc3QtYzogJTAyeCBkc3QtYXNt OiAlMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNyY19waXhlbHNb ZmFpbF9vZmZzZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGRpdGhlclso ZmFpbF9vZmZzZXQgKyBmYWlsX29mZnNldCkgJiA3XSwKQEAgLTE1OCw3ICsxNjcsNyBAQCBzdGF0 aWMgdm9pZCBjaGVja195dXYyeXV2MShpbnQgYWNjdXJhdGUpCiAgICAgc3dzX2ZyZWVDb250ZXh0 KHN3cyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX3l1djJ5dXZYKGludCBhY2N1cmF0ZSkKK3N0 YXRpYyB2b2lkIGNoZWNrX3l1djJ5dXZYKGludCBhY2N1cmF0ZSwgaW50IGJpdF9kZXB0aCwgaW50 IGRzdF9waXhfZm9ybWF0KQogewogICAgIFN3c0NvbnRleHQgKnN3czsKICAgICBTd3NJbnRlcm5h bCAqYzsKQEAgLTE3OSw4ICsxODgsOCBAQCBzdGF0aWMgdm9pZCBjaGVja195dXYyeXV2WChpbnQg YWNjdXJhdGUpCiAgICAgY29uc3QgaW50MTZfdCAqKnNyYzsKICAgICBMT0NBTF9BTElHTkVEXzE2 KGludDE2X3QsIHNyY19waXhlbHMsIFtMQVJHRVNUX0ZJTFRFUiAqIExBUkdFU1RfSU5QVVRfU0la RV0pOwogICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgZmlsdGVyX2NvZWZmLCBbTEFSR0VT VF9GSUxURVJdKTsKLSAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdDAsIFtMQVJHRVNU X0lOUFVUX1NJWkVdKTsKLSAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdDEsIFtMQVJH RVNUX0lOUFVUX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQxNl90LCBkc3QwLCBb TEFSR0VTVF9JTlBVVF9TSVpFXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50MTZfdCwgZHN0 MSwgW0xBUkdFU1RfSU5QVVRfU0laRV0pOwogICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwg ZGl0aGVyLCBbTEFSR0VTVF9JTlBVVF9TSVpFXSk7CiAgICAgdW5pb24gVkZpbHRlckRhdGF7CiAg ICAgICAgIGNvbnN0IGludDE2X3QgKnNyYzsKQEAgLTE5MCwxMiArMTk5LDE0IEBAIHN0YXRpYyB2 b2lkIGNoZWNrX3l1djJ5dXZYKGludCBhY2N1cmF0ZSkKICAgICBtZW1zZXQoZGl0aGVyLCBkX3Zh bCwgTEFSR0VTVF9JTlBVVF9TSVpFKTsKICAgICByYW5kb21pemVfYnVmZmVycygodWludDhfdCop c3JjX3BpeGVscywgTEFSR0VTVF9GSUxURVIgKiBMQVJHRVNUX0lOUFVUX1NJWkUgKiBzaXplb2Yo aW50MTZfdCkpOwogICAgIHN3cyA9IHN3c19hbGxvY19jb250ZXh0KCk7CisgICAgc3dzLT5kc3Rf Zm9ybWF0ID0gZHN0X3BpeF9mb3JtYXQ7CiAgICAgaWYgKGFjY3VyYXRlKQogICAgICAgICBzd3Mt PmZsYWdzIHw9IFNXU19BQ0NVUkFURV9STkQ7CiAgICAgaWYgKHN3c19pbml0X2NvbnRleHQoc3dz LCBOVUxMLCBOVUxMKSA8IDApCiAgICAgICAgIGZhaWwoKTsKIAogICAgIGMgPSBzd3NfaW50ZXJu YWwoc3dzKTsKKyAgICBjLT5kc3RCcGMgPSBiaXRfZGVwdGg7CiAgICAgZmZfc3dzX2luaXRfc2Nh bGUoYyk7CiAgICAgZm9yKGlzaSA9IDA7IGlzaSA8IEZGX0FSUkFZX0VMRU1TKGlucHV0X3NpemVz KTsgKytpc2kpewogICAgICAgICBkc3RXID0gaW5wdXRfc2l6ZXNbaXNpXTsKQEAgLTIyNywyNCAr MjM4LDM5IEBAIHN0YXRpYyB2b2lkIGNoZWNrX3l1djJ5dXZYKGludCBhY2N1cmF0ZSkKICAgICAg ICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgNDsgKytqKQogICAgICAgICAgICAgICAgICAg ICAgICAgdkZpbHRlckRhdGFbaV0uY29lZmZbaiArIDRdID0gZmlsdGVyX2NvZWZmW2ldOwogICAg ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tfZnVuYyhjLT55dXYycGxh bmVYLCAieXV2Mnl1dlhfJWRfJWRfJWRfJXMiLCBmaWx0ZXJfc2l6ZXNbZnNpXSwgb3NpLCBkc3RX LCBhY2N1cmF0ZV9zdHIpKXsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tfZnVuYyhjLT55dXYy cGxhbmVYLCAieXV2Mnl1dlhfJWRfJXNfJWRfJWRfJWRfJXMiLCBiaXRfZGVwdGgsIGlzQkUoZHN0 X3BpeF9mb3JtYXQpID8gIkJFIiA6ICJMRSIsIGZpbHRlcl9zaXplc1tmc2ldLCBvc2ksIGRzdFcs IGFjY3VyYXRlX3N0cikpewogICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdkZpbHRlckRhdGEg Zm9yIHRoZSBtbXggZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAq ZmlsdGVyID0gYy0+dXNlX21teF92ZmlsdGVyID8gKGNvbnN0IGludDE2X3QqKXZGaWx0ZXJEYXRh IDogJmZpbHRlcl9jb2VmZlswXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRzdDAsIDAs IExBUkdFU1RfSU5QVVRfU0laRSAqIHNpemVvZihkc3QwWzBdKSk7CiAgICAgICAgICAgICAgICAg ICAgIG1lbXNldChkc3QxLCAwLCBMQVJHRVNUX0lOUFVUX1NJWkUgKiBzaXplb2YoZHN0MVswXSkp OwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSBjYWxsX3JlZiBoZXJlLCBi ZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdXNlX21teF92ZmlsdGVyIHdhcyBzZXQgZm9yIHRoYXQK LSAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gb3Igbm90LCBzbyB3ZSBjYW4ndCBwYXNz IGl0IHRoZSBwYXJhbWV0ZXJzIGNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgeXV2MnBs YW5lWF84X3JlZigmZmlsdGVyX2NvZWZmWzBdLCBmaWx0ZXJfc2l6ZXNbZnNpXSwgc3JjLCBkc3Qw LCBkc3RXIC0gb3NpLCBkaXRoZXIsIG9zaSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGMtPmRz dEJwYyA9PSA4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAg ICAvLyBXZSBjYW4ndCB1c2UgY2FsbF9yZWYgaGVyZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlm IHVzZV9tbXhfdmZpbHRlciB3YXMgc2V0IGZvciB0aGF0CisgICAgICAgICAgICAgICAgICAgICAg ICAvLyBmdW5jdGlvbiBvciBub3QsIHNvIHdlIGNhbid0IHBhc3MgaXQgdGhlIHBhcmFtZXRlcnMg Y29ycmVjdGx5LgogCi0gICAgICAgICAgICAgICAgICAgIGNhbGxfbmV3KGZpbHRlciwgZmlsdGVy X3NpemVzW2ZzaV0sIHNyYywgZHN0MSwgZHN0VyAtIG9zaSwgZGl0aGVyLCBvc2kpOwotICAgICAg ICAgICAgICAgICAgICBpZiAoY21wX29mZl9ieV9uKGRzdDAsIGRzdDEsIExBUkdFU1RfSU5QVVRf U0laRSAqIHNpemVvZihkc3QwWzBdKSwgYWNjdXJhdGUgPyAwIDogMikpIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZmFp bGVkOiB5dXYyeXV2WF8lZF8lZF8lZF8lc1xuIiwgZmlsdGVyX3NpemVzW2ZzaV0sIG9zaSwgZHN0 VywgYWNjdXJhdGVfc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfZGlmZmVyZW5j ZXMoZHN0MCwgZHN0MSwgTEFSR0VTVF9JTlBVVF9TSVpFICogc2l6ZW9mKGRzdDBbMF0pKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZVhfOF9yZWYoJmZpbHRlcl9jb2VmZlswXSwg ZmlsdGVyX3NpemVzW2ZzaV0sIHNyYywgKHVpbnQ4X3QqKWRzdDAsIGRzdFcgLSBvc2ksIGRpdGhl ciwgb3NpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfbmV3KGZpbHRlciwgZmlsdGVy X3NpemVzW2ZzaV0sIHNyYywgKHVpbnQ4X3QqKWRzdDEsIGRzdFcgLSBvc2ksIGRpdGhlciwgb3Np KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtcF9vZmZfYnlfOCgodWludDhfdCop ZHN0MCwgKHVpbnQ4X3QqKWRzdDEsIExBUkdFU1RfSU5QVVRfU0laRSwgYWNjdXJhdGUgPyAwIDog MikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcHJpbnRmKCJmYWlsZWQ6IHl1djJ5dXZYXyVkXyVzXyVkXyVkXyVkXyVz XG4iLCBiaXRfZGVwdGgsIGlzQkUoZHN0X3BpeF9mb3JtYXQpID8gIkJFIiA6ICJMRSIsIGZpbHRl cl9zaXplc1tmc2ldLCBvc2ksIGRzdFcsIGFjY3VyYXRlX3N0cik7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2hvd19kaWZmZXJlbmNlc184KCh1aW50OF90Kilkc3QwLCAodWludDhfdCop ZHN0MSwgTEFSR0VTVF9JTlBVVF9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVmKCZmaWx0ZXJfY29l ZmZbMF0sIGZpbHRlcl9zaXplc1tmc2ldLCBzcmMsICh1aW50OF90Kilkc3QwLCBkc3RXIC0gb3Np LCBkaXRoZXIsIG9zaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX25ldygmZmlsdGVy X2NvZWZmWzBdLCBmaWx0ZXJfc2l6ZXNbZnNpXSwgc3JjLCAodWludDhfdCopZHN0MSwgZHN0VyAt IG9zaSwgZGl0aGVyLCBvc2kpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY21wX29m Zl9ieV8xNihkc3QwLCBkc3QxLCBMQVJHRVNUX0lOUFVUX1NJWkUsIGFjY3VyYXRlID8gMCA6IDIp KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHByaW50ZigiZmFpbGVkOiB5dXYyeXV2WF8lZF8lc18lZF8lZF8lZF8lc1xu IiwgYml0X2RlcHRoLCBpc0JFKGRzdF9waXhfZm9ybWF0KSA/ICJCRSIgOiAiTEUiLCBmaWx0ZXJf c2l6ZXNbZnNpXSwgb3NpLCBkc3RXLCBhY2N1cmF0ZV9zdHIpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNob3dfZGlmZmVyZW5jZXNfMTYoZHN0MCwgZHN0MSwgTEFSR0VTVF9JTlBVVF9T SVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgICAgICAgICBpZihkc3RXID09IExBUkdFU1RfSU5QVVRfU0laRSkKLSAgICAg ICAgICAgICAgICAgICAgICAgIGJlbmNoX25ldygoY29uc3QgaW50MTZfdCopdkZpbHRlckRhdGEs IGZpbHRlcl9zaXplc1tmc2ldLCBzcmMsIGRzdDEsIGRzdFcgLSBvc2ksIGRpdGhlciwgb3NpKTsK KyAgICAgICAgICAgICAgICAgICAgICAgIGJlbmNoX25ldyhmaWx0ZXIsIGZpbHRlcl9zaXplc1tm c2ldLCBzcmMsICh1aW50OF90Kilkc3QxLCBkc3RXIC0gb3NpLCBkaXRoZXIsIG9zaSk7CiAKICAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnNyYyk7CkBAIC0zMTEs MTAgKzMzNywxMCBAQCBzdGF0aWMgdm9pZCBjaGVja195dXYybnYxMmNYKGludCBhY2N1cmF0ZSkK ICAgICAgICAgICAgICAgICBjYWxsX3JlZihzd3MtPmRzdF9mb3JtYXQsIGRpdGhlciwgJmZpbHRl cl9jb2VmZlswXSwgZmlsdGVyX3NpemUsIHNyY1UsIHNyY1YsIGRzdDAsIGRzdFcpOwogICAgICAg ICAgICAgICAgIGNhbGxfbmV3KHN3cy0+ZHN0X2Zvcm1hdCwgZGl0aGVyLCAmZmlsdGVyX2NvZWZm WzBdLCBmaWx0ZXJfc2l6ZSwgc3JjVSwgc3JjViwgZHN0MSwgZHN0Vyk7CiAKLSAgICAgICAgICAg ICAgICBpZiAoY21wX29mZl9ieV9uKGRzdDAsIGRzdDEsIGRzdFcgKiAyICogc2l6ZW9mKGRzdDBb MF0pLCBhY2N1cmF0ZSA/IDAgOiAyKSkgeworICAgICAgICAgICAgICAgIGlmIChjbXBfb2ZmX2J5 XzgoZHN0MCwgZHN0MSwgZHN0VyAqIDIgKiBzaXplb2YoZHN0MFswXSksIGFjY3VyYXRlID8gMCA6 IDIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgICAgICAgICAgICAg cHJpbnRmKCJmYWlsZWQ6IHl1djJudjEyd1hfJWRfJWRfJXNcbiIsIGZpbHRlcl9zaXplLCBkc3RX LCBhY2N1cmF0ZV9zdHIpOwotICAgICAgICAgICAgICAgICAgICBzaG93X2RpZmZlcmVuY2VzKGRz dDAsIGRzdDEsIGRzdFcgKiAyICogc2l6ZW9mKGRzdDBbMF0pKTsKKyAgICAgICAgICAgICAgICAg ICAgc2hvd19kaWZmZXJlbmNlc184KGRzdDAsIGRzdDEsIGRzdFcgKiAyICogc2l6ZW9mKGRzdDBb MF0pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRzdFcgPT0gTEFS R0VTVF9JTlBVVF9TSVpFKQogICAgICAgICAgICAgICAgICAgICBiZW5jaF9uZXcoc3dzLT5kc3Rf Zm9ybWF0LCBkaXRoZXIsICZmaWx0ZXJfY29lZmZbMF0sIGZpbHRlcl9zaXplLCBzcmNVLCBzcmNW LCBkc3QxLCBkc3RXKTsKQEAgLTQ0MSw5ICs0NjcsMzMgQEAgdm9pZCBjaGVja2FzbV9jaGVja19z d19zY2FsZSh2b2lkKQogICAgIGNoZWNrX3l1djJ5dXYxKDApOwogICAgIGNoZWNrX3l1djJ5dXYx KDEpOwogICAgIHJlcG9ydCgieXV2Mnl1djEiKTsKLSAgICBjaGVja195dXYyeXV2WCgwKTsKLSAg ICBjaGVja195dXYyeXV2WCgxKTsKLSAgICByZXBvcnQoInl1djJ5dXZYIik7CisgICAgY2hlY2tf eXV2Mnl1dlgoMCwgOCwgQVZfUElYX0ZNVF9ZVVY0MjBQKTsKKyAgICBjaGVja195dXYyeXV2WCgx LCA4LCBBVl9QSVhfRk1UX1lVVjQyMFApOworICAgIHJlcG9ydCgieXV2Mnl1dlhfOCIpOworICAg IGNoZWNrX3l1djJ5dXZYKDAsIDksIEFWX1BJWF9GTVRfWVVWNDIwUDlMRSk7CisgICAgY2hlY2tf eXV2Mnl1dlgoMSwgOSwgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFKTsKKyAgICByZXBvcnQoInl1djJ5 dXZYXzlMRSIpOworICAgIGNoZWNrX3l1djJ5dXZYKDAsIDksIEFWX1BJWF9GTVRfWVVWNDIwUDlC RSk7CisgICAgY2hlY2tfeXV2Mnl1dlgoMSwgOSwgQVZfUElYX0ZNVF9ZVVY0MjBQOUJFKTsKKyAg ICByZXBvcnQoInl1djJ5dXZYXzlCRSIpOworICAgIGNoZWNrX3l1djJ5dXZYKDAsIDEwLCBBVl9Q SVhfRk1UX1lVVjQyMFAxMExFKTsKKyAgICBjaGVja195dXYyeXV2WCgxLCAxMCwgQVZfUElYX0ZN VF9ZVVY0MjBQMTBMRSk7CisgICAgcmVwb3J0KCJ5dXYyeXV2WF8xMExFIik7CisgICAgY2hlY2tf eXV2Mnl1dlgoMCwgMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEwQkUpOworICAgIGNoZWNrX3l1djJ5 dXZYKDEsIDEwLCBBVl9QSVhfRk1UX1lVVjQyMFAxMEJFKTsKKyAgICByZXBvcnQoInl1djJ5dXZY XzEwQkUiKTsKKyAgICBjaGVja195dXYyeXV2WCgwLCAxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTJM RSk7CisgICAgY2hlY2tfeXV2Mnl1dlgoMSwgMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUpOwor ICAgIHJlcG9ydCgieXV2Mnl1dlhfMTJMRSIpOworICAgIGNoZWNrX3l1djJ5dXZYKDAsIDEyLCBB Vl9QSVhfRk1UX1lVVjQyMFAxMkJFKTsKKyAgICBjaGVja195dXYyeXV2WCgxLCAxMiwgQVZfUElY X0ZNVF9ZVVY0MjBQMTJCRSk7CisgICAgcmVwb3J0KCJ5dXYyeXV2WF8xMkJFIik7CisgICAgY2hl Y2tfeXV2Mnl1dlgoMCwgMTQsIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEUpOworICAgIGNoZWNrX3l1 djJ5dXZYKDEsIDE0LCBBVl9QSVhfRk1UX1lVVjQyMFAxNExFKTsKKyAgICByZXBvcnQoInl1djJ5 dXZYXzE0TEUiKTsKKyAgICBjaGVja195dXYyeXV2WCgwLCAxNCwgQVZfUElYX0ZNVF9ZVVY0MjBQ MTRCRSk7CisgICAgY2hlY2tfeXV2Mnl1dlgoMSwgMTQsIEFWX1BJWF9GTVRfWVVWNDIwUDE0QkUp OworICAgIHJlcG9ydCgieXV2Mnl1dlhfMTRCRSIpOwogICAgIGNoZWNrX3l1djJudjEyY1goMCk7 CiAgICAgY2hlY2tfeXV2Mm52MTJjWCgxKTsKICAgICByZXBvcnQoInl1djJudjEyY1giKTsKLS0g CjIuMzQuMQoK --_004_PN3P287MB3339E53168F261F6CCCF13B79A57APN3P287MB3339INDP_ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ 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". --_004_PN3P287MB3339E53168F261F6CCCF13B79A57APN3P287MB3339INDP_--