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 6C0234F9EB for ; Tue, 24 Jun 2025 07:47:27 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 1DAE068C5F6; Tue, 24 Jun 2025 10:47:23 +0300 (EEST) Received: from PNZPR01CU001.outbound.protection.outlook.com (mail-centralindiaazon11021100.outbound.protection.outlook.com [40.107.51.100]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 655CB68C3DD for ; Tue, 24 Jun 2025 10:47:16 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nGXfvBNO2fDrZrNbYissmNPrxqYdamLZ+gXg2lcGNxejRVwoWJ1ki5dddF+LjQ/FPEr9sMKJYzBCJ8QIqr8EIgyMIiasOlxEy6ktWszhtZaF6TthrhZIKOa7c/9l/imPJIVf9kJ03D528xy0ILRDY58KENOQtWP2MlNUSeHEIxbih2bxSuDHlcraDAHY+4hN7Sr5ReTVgeUduVaTPggTxpjQQTC5PV6umCVyK10gsaPcWJa9d097BKJJrASPFLX0qV+zQqPPYJLMyhyve1ySMPAaQjV7uDyP5xeZgboAFZ35PCwjMtvtFGL01qCQppFMWEhDWsgf1XON3MlUIDnStA== 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=vVud5iAqKh/QCy4UUFZGTybDGFGJGaeZeatUVSxAjuk=; b=HCM0mwBK3yycDnQ8Wop1O2on+QsJW51B6cy9786CjA6IdMjcwsHdmjXDOBsXlWhthhHVUEdpgaKq0YkZOIb0Ji29chqh0MU6TngcnY+nvdXpu0lqSn61esnQT5eXmLBTJOvE2qWSmu4pWb1y0LQtSNQi49EBQvH9NgnGJSYX+oHuYiIA2TGuR0eTL0vGQ4hxmOfE8Rx+FGOx9/J6E/2CQ/IHCfrk+bwl5GEGQsnGSj5IwygAp/uI9UG0ycDhAz/tuHj7wzGoEaGiWHe5yIRXpObtegMa4dJXM/Pqu/zbpACSsDnneHwZeYDkMbq4TQl/nq+QL2BQWpIePY85MpnkEA== 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=vVud5iAqKh/QCy4UUFZGTybDGFGJGaeZeatUVSxAjuk=; b=Qz0xmK9DDstEkbGKfB5xoG8ctLAjKzSbpOi/q+56x6uEfYdDuZwxG2qKTddALtM0tdSjfJrvGF70aoHe1ZEQy1lfVFJvo/n9Q98B6azkNe/vs53263RAxhTcExuBIxa1nTCB73RnqY469hBTIHUS2pNTFZDlpZWdm7CPXaI4jt+kfsjEjNUPhVKeCoPbbbRI9ulTNtmXdCU7WXIAKUWZ/OH/X3a0zWFzOAFXpXaRxsJcpqhv+JPjkk8x9kNRClD0riaedMAY28fo4vvyp+JTHAYQTINakVgbJsCfDr9h7uGQ8yS1wzn/Vfk/i7hiNRmxNZ7Lb8bKAhzrH2sKDbxIUw== Received: from PN0P287MB1494.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:186::9) by PN3P287MB0971.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:177::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.30; Tue, 24 Jun 2025 07:47:12 +0000 Received: from PN0P287MB1494.INDP287.PROD.OUTLOOK.COM ([fe80::1a78:65d:b254:359]) by PN0P287MB1494.INDP287.PROD.OUTLOOK.COM ([fe80::1a78:65d:b254:359%5]) with mapi id 15.20.8857.026; Tue, 24 Jun 2025 07:47:12 +0000 From: Dash Santosh Sathyanarayanan To: FFmpeg development discussions and patches Thread-Topic: [PATCH v2 1/2] avfilter: add scale_d3d11 filter Thread-Index: AQHb5NhPahpooxpuZUqlUaE9lGAbng== Date: Tue, 24 Jun 2025 07:47:11 +0000 Message-ID: Accept-Language: en-IN, en-US Content-Language: en-IN X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: 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: PN0P287MB1494:EE_|PN3P287MB0971:EE_ x-ms-office365-filtering-correlation-id: 26759a17-a007-4c07-5383-08ddb2f35461 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|366016|376014|10070799003|4053099003|38070700018; x-microsoft-antispam-message-info: =?iso-8859-1?Q?iJUF4w5Ag4hyh19gsI+jc3XAdFLH2unaPrQGEJRE7r482I473uo0FdMGM0?= =?iso-8859-1?Q?sN8eTOysONFpl5an4wHSGEfXj7tWcKCl5r9qC82RGeNKtunsAs243Z+iJx?= =?iso-8859-1?Q?EUpLTWVQAWDNuJeH5FQ5Xl10KmUfmiiu7r1WdIbwSqEpymhO/bTXFRZ0aR?= =?iso-8859-1?Q?Wcu9CH2sM9cJ3dLYnX/a9dol4bPJY19QFWXnaZ8EKNCgHDsv75g9vuftIz?= =?iso-8859-1?Q?l4XdxOCrlDxL01Bgn73wSAxgvRntl0BUjMZ5/lZPMvOqaqWc3GoPk3VbzD?= =?iso-8859-1?Q?31hQF2jqSr1xIrEhW5M1T2k9jMbTSYsroyNAeyRiCHESPwY6WDm5S9M3SX?= =?iso-8859-1?Q?+vA9QhtzWFpU7DUPHSHXYv7WVK6yuLdmLCZ0KlgGHSkwHOPYygpBC8wOer?= =?iso-8859-1?Q?gLkpoCz58XiqcBRxOUEf9rvx8Icp+V5U4deJlzKuG0+F1BwDeDqr+oaXaj?= =?iso-8859-1?Q?vVJycj7foRfxYBHgEDZSPbN+fy/l/5+n0BnMZikgYMkg7CsM0D48hREny2?= =?iso-8859-1?Q?kbOQPwxYFYK+7GrCsWXF1wRiCHp5QLzQ2aZh/7Q7do+S/Pm8xGUjl8bStP?= =?iso-8859-1?Q?6ZLMjrO7WTD5T1TjEDwQtBofo8DuslWhUc8nXrUvU2lAUdyRLJkhpf4JP6?= =?iso-8859-1?Q?jHIlQ1ci5TceA5+dpZ7tas3nL4XN3+xXcoMxZ+dew55bdxCoTQq9WTaWWI?= =?iso-8859-1?Q?//UF215Yy92s0FUlELYpkmn+eoS9RJV2YF+HRRgm0FrHniHUGI+HFiS1SN?= =?iso-8859-1?Q?6ma9ri0fUjg3x+SNMBuUIHOLgNhzUqhpeR9g5QN4l63xM6KF8nWGI5QBvs?= =?iso-8859-1?Q?sMM3kBggBIusPE6LdMiYx8ST70Sb1w7rtrcz9UOSmCD3H3twVyVrJbhGYn?= =?iso-8859-1?Q?AY1yCMmj4eMTtFLv6679t21ZLe6XRbXy91GaXDc1a9OiAKeQ04GWJa93XF?= =?iso-8859-1?Q?lU91NItoCMyfvq3wn5bDrG4piFCAHgs8yBVHk1P7SUXcQ4ucBoz4HaVvrH?= =?iso-8859-1?Q?q18IYZEga342OItuRm1poFHtK1/oxCsSkv6T7IyCj11PpOs+TViN+XgUem?= =?iso-8859-1?Q?gW6NjhBs81jxUc46H9ZbErA/DYTtWrT2rhr454H44ea4dvNQI+Mki5u/4e?= =?iso-8859-1?Q?eg9PTwH3znX+NhgcpNN+Ty3/XpXVCT/oM+hr2VTrLbXXhsm+LXe0ls7Ah0?= =?iso-8859-1?Q?8/1ByQxvbEPFcBkXcLaw7lrKdxk6/PNYp3s/F1l9c413YHjwz+hc8TvixI?= =?iso-8859-1?Q?1EEJIMyp1u2kxkbh5abaju/anhz9rupupQMaEpzBUSGFWToNYJzuCSpWUB?= =?iso-8859-1?Q?pv/bVjvMO+wwWIeSc/D39AyMf2iFUtvyUh8kkKN9vhIhJa58OMmtCkxGI1?= =?iso-8859-1?Q?q4dljwMoeoIdM3Xa5Ybpf1Q9v+d57ZkTxspIFFwiRTQpFtN8waT9vmrJPr?= =?iso-8859-1?Q?JuPk5nyZ8LGKGWCDH8njBWptge6ABkduYaYwxco+W0LwH34GoUV0QbpaHQ?= =?iso-8859-1?Q?pIpn+PZOgtQOwNvciZUn8nLLP8to9H2Hid3M8zUfh8tm3mh8yfZ6HXFb/g?= =?iso-8859-1?Q?lo4+T+I=3D?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PN0P287MB1494.INDP287.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(366016)(376014)(10070799003)(4053099003)(38070700018); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?WC9UYjp+JqBbfn3eYdHgs11cz8taaGviyiyK2Fv9xY3TEN74yOEgd/u9BN?= =?iso-8859-1?Q?0NICGI5wbGuytWV4N5oMoQD9p/btd42u1SkMKrsC4TqtHXMs/0w94a6tOP?= =?iso-8859-1?Q?OyCdsoaFyA8QbvWzP1Np0CAS8QdrnI5JG6y7sQANkPpLJnoqov7ipSiLYE?= =?iso-8859-1?Q?qeFygskeKkNVhnnDQ7+j5qN8G6n+kNsDoN1TZQ3ADwW3pkAqVMYYXRZp4n?= =?iso-8859-1?Q?kLe5huK1XLynCsR6lkAQDnketVdxTxW6m/0NQgE6LP5VjDNvgD3bRSl8oY?= =?iso-8859-1?Q?IuSrB3RH/CgPKqw0i4kLm2rq2TzvoqDyHAc1R7YTwmpBza1laKBpv6+KJp?= =?iso-8859-1?Q?s3Zz0K64PL4ez5ybIJzWnefFaWYK1IvlHtavdNB/dGZAeUI1yWNbPMFe+4?= =?iso-8859-1?Q?JJL+N13K6WJ6sNPSxV2FNhnQttCIt2z2oyCMadh0X82AbLSL80C1n04l/A?= =?iso-8859-1?Q?BdQz3WNyGaHahvRgkOnoOMnhdoGBuycdu+aw0h20txCMPyIOUw0LTWRMPH?= =?iso-8859-1?Q?bRElq69Iu/uyKG3mk/4UaRYyymumN1AOGCEX6ZBu0chxegCECvhFUoXKSR?= =?iso-8859-1?Q?ahATaqyphF2JrZ8z4NBKxmEUiULdDDS2zCcbDmzIh8X0zTO3YzWgjwzes5?= =?iso-8859-1?Q?vBnrtADglKhXIUlNXk9FdQjAQV96wizeIyEeIBfnq6+D0AS0bVwLSNH34T?= =?iso-8859-1?Q?IjpEKp/5BndeRazOCfSXAHMWBxvU0h6jBBS+GVr49qZAYH+HibIVLU0eF9?= =?iso-8859-1?Q?dUvRDEALjIERNFNM8HQ8YGv+AEMdxPqzhEKdroB+SyAIN4cljoOqYqH+EA?= =?iso-8859-1?Q?YMr3BK8amZ3+wHNB8vym9x7tlUXrFx0/zj0j0CxqTVEUobkN00okvQ/fbP?= =?iso-8859-1?Q?eCHhPa5L4MXoLWCDzoY8IAruSC/G7mYxW7B+P7IOwrbAAOdgkgpOMYIAk+?= =?iso-8859-1?Q?F8MhEJ/DTYzoClOi1kMeFW94HxehPW0evxoHt+aO3xXrYUm95JOP94j+Kk?= =?iso-8859-1?Q?Qsu7llGr4GHGFVGD8WPkrGfLAfHeRD1+l51keMmbldLqolW4tolY0IhX9a?= =?iso-8859-1?Q?4otqm8P4yq9prnwPBldTo7IiCBgh0fzqawUgdQthqI+ExGHab1tv0S7SH1?= =?iso-8859-1?Q?pxk2Ani6XOY1DAfFOsN1F5zSUm6vS3NsQX46gvE1fBG7Q4E3pibDkw/2dn?= =?iso-8859-1?Q?vXIf8JNAb9sFSWT2t4XDK9SqC+N28eHh0cqiEvsDoy800peKe6KkMH0y3e?= =?iso-8859-1?Q?j4VSvf50Dgjzsc8npJo/QcDkT+R4NGW1w0IonVagJ5GOC5sfbESwn+eOTv?= =?iso-8859-1?Q?WJ5hS8ePjbkiaON9c0hhq+xSRmRI+4dfJRZG3sTHUPNGBnxipgiB8LNXEb?= =?iso-8859-1?Q?1/wRnnEz5i2aWRj1TximAUI86aRGVH9yOdtea1yLUXdSSR/lDsJa2J9bAA?= =?iso-8859-1?Q?BDTNfRCku5hPtIWCp0HE8ceDSj9V1f1WzNQoB2SoHH//Tn+xwfDml2vdWY?= =?iso-8859-1?Q?Z77v/nzg0ws7kLlL10r/8OOk3Ptt6NXiNtgQtrwmGOBz+OcY19dCErIc/2?= =?iso-8859-1?Q?JX4A3zYhc7gFIx8bc/J/V2VAM0E7aZptTtKYWw5ZIEq9kNf76l8nUK4Rnp?= =?iso-8859-1?Q?l+IiqAXco2FRhsMh551IiAeMkSIDvPa7wD1vqbbLAuxCagfWLoBThvGmeq?= =?iso-8859-1?Q?377w3JktRac1JRXdBD2giEa2IiMk+GRns2vbHBt5rpA4J9Y9j/ELu1N5/o?= =?iso-8859-1?Q?UCibIWBTqY50RyPrO1toqHF5s=3D?= Content-Type: multipart/mixed; boundary="_002_PN0P287MB14942AAD2334BBE2044868D6E178APN0P287MB1494INDP_" MIME-Version: 1.0 X-OriginatorOrg: multicorewareinc.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PN0P287MB1494.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 26759a17-a007-4c07-5383-08ddb2f35461 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Jun 2025 07:47:11.8619 (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: TR3XDx7hqstadvqO78dINLs63D4s4i7UWXfOl2Kco9To95AwfYW46Jux6hA/wxiL3zvtNPCToSMOsnM7BhEcI3UU2Oc/j8zMMrzkWcdzFd8CaK4ZtXfX2xFfpheFUb0qAxkAeJ7A3XgeFTxxBAAsAA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN3P287MB0971 Subject: [FFmpeg-devel] [PATCH v2 1/2] avfilter: add scale_d3d11 filter 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: --_002_PN0P287MB14942AAD2334BBE2044868D6E178APN0P287MB1494INDP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable This commit introduces a new hardware-accelerated video filter, scale_d3d11= ,=0A= which performs scaling and format conversion using Direct3D 11. The filter = enables=0A= efficient GPU-based scaling and pixel format conversion (p010 to nv12), red= ucing=0A= CPU overhead and latency in video pipelines.=0A= =0A= > + if (frames_ctx->sw_format =3D=3D AV_PIX_FMT_NV12) {=0A= > + frames_hwctx->BindFlags |=3D D3D11_BIND_VIDEO_ENCODER;=0A= > + }=0A= > =0A= > The filter should be designed universally rather than expecting to be con= nected=0A= > to something specific at its output. Whether or not the bind_encoder bind= flag=0A= > should be set, needs to be determined during negotiation of the output=0A= > connection.=0A= =0A= The above change is in dxva2.c, when the decoder output surface is passed d= irectly=0A= to supported encoder, it requires BIND_VIDEO_ENCODER flag to be set. This d= oes not=0A= affect any intermediate steps. A surface with encoder bindflags set can be = used as=0A= input for any supported filters as well (confirmed with the scale_d3d11 fil= ter).=0A= =0A= Rest of the comments have been handled.=0A= =0A= Thanks,=0A= Dash=0A= =0A= ---=0A= Changelog | 1 +=0A= libavcodec/dxva2.c | 3 +=0A= libavfilter/Makefile | 1 +=0A= libavfilter/allfilters.c | 1 +=0A= libavfilter/vf_scale_d3d11.c | 464 ++++++++++++++++++++++++++++++++++=0A= libavutil/hwcontext_d3d11va.c | 33 ++-=0A= 6 files changed, 492 insertions(+), 11 deletions(-)=0A= create mode 100644 libavfilter/vf_scale_d3d11.c=0A= =0A= diff --git a/Changelog b/Changelog=0A= index 4217449438..56122ef555 100644=0A= --- a/Changelog=0A= +++ b/Changelog=0A= @@ -18,6 +18,7 @@ version :=0A= - APV encoding support through a libopenapv wrapper=0A= - VVC decoder supports all content of SCC (Screen Content Coding):=0A= IBC (Inter Block Copy), Palette Mode and ACT (Adaptive Color Transform= =0A= +- Add vf_scale_d3d11 filter=0A= =0A= =0A= version 7.1:=0A= diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c=0A= index 22ecd5acaf..37dab6cd68 100644=0A= --- a/libavcodec/dxva2.c=0A= +++ b/libavcodec/dxva2.c=0A= @@ -647,6 +647,9 @@ int ff_dxva2_common_frame_params(AVCodecContext *avctx,= =0A= AVD3D11VAFramesContext *frames_hwctx =3D frames_ctx->hwctx;=0A= =0A= frames_hwctx->BindFlags |=3D D3D11_BIND_DECODER;=0A= + if (frames_ctx->sw_format =3D=3D AV_PIX_FMT_NV12) {=0A= + frames_hwctx->BindFlags |=3D D3D11_BIND_VIDEO_ENCODER;=0A= + }=0A= }=0A= #endif=0A= =0A= diff --git a/libavfilter/Makefile b/libavfilter/Makefile=0A= index 97f8f17272..95612d753d 100644=0A= --- a/libavfilter/Makefile=0A= +++ b/libavfilter/Makefile=0A= @@ -462,6 +462,7 @@ OBJS-$(CONFIG_ROBERTS_OPENCL_FILTER) +=3D vf_co= nvolution_opencl.o opencl.o=0A= OBJS-$(CONFIG_ROTATE_FILTER) +=3D vf_rotate.o=0A= OBJS-$(CONFIG_SAB_FILTER) +=3D vf_sab.o=0A= OBJS-$(CONFIG_SCALE_FILTER) +=3D vf_scale.o scale_eval.o = framesync.o=0A= +OBJS-$(CONFIG_SCALE_D3D11_FILTER) +=3D vf_scale_d3d11.o scale_e= val.o=0A= OBJS-$(CONFIG_SCALE_CUDA_FILTER) +=3D vf_scale_cuda.o scale_ev= al.o \=0A= vf_scale_cuda.ptx.o cuda/l= oad_helper.o=0A= OBJS-$(CONFIG_SCALE_NPP_FILTER) +=3D vf_scale_npp.o scale_eva= l.o=0A= diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c=0A= index 3bc045b28f..ec5e09494a 100644=0A= --- a/libavfilter/allfilters.c=0A= +++ b/libavfilter/allfilters.c=0A= @@ -436,6 +436,7 @@ extern const FFFilter ff_vf_scale;=0A= extern const FFFilter ff_vf_vpp_amf;=0A= extern const FFFilter ff_vf_sr_amf;=0A= extern const FFFilter ff_vf_scale_cuda;=0A= +extern const FFFilter ff_vf_scale_d3d11;=0A= extern const FFFilter ff_vf_scale_npp;=0A= extern const FFFilter ff_vf_scale_qsv;=0A= extern const FFFilter ff_vf_scale_vaapi;=0A= diff --git a/libavfilter/vf_scale_d3d11.c b/libavfilter/vf_scale_d3d11.c=0A= new file mode 100644=0A= index 0000000000..0b7476dd15=0A= --- /dev/null=0A= +++ b/libavfilter/vf_scale_d3d11.c=0A= @@ -0,0 +1,464 @@=0A= +/*=0A= + * Copyright (C) 2025 MulticorewWare, Inc.=0A= + *=0A= + * Authors: Dash Santosh =0A= + * Sachin =0A= + *=0A= + * This file is part of FFmpeg.=0A= + *=0A= + * FFmpeg is free software; you can redistribute it and/or=0A= + * modify it under the terms of the GNU Lesser General Public=0A= + * License as published by the Free Software Foundation; either=0A= + * version 2.1 of the License, or (at your option) any later version.=0A= + *=0A= + * FFmpeg is distributed in the hope that it will be useful,=0A= + * but WITHOUT ANY WARRANTY; without even the implied warranty of=0A= + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU=0A= + * Lesser General Public License for more details.=0A= + *=0A= + * You should have received a copy of the GNU Lesser General Public=0A= + * License along with FFmpeg; if not, write to the Free Software=0A= + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-130= 1 USA=0A= + */=0A= +=0A= +#include "libavutil/opt.h"=0A= +#include "libavutil/pixdesc.h"=0A= +#include "compat/w32dlfcn.h"=0A= +=0A= +#include "libavutil/hwcontext.h"=0A= +#include "libavutil/hwcontext_d3d11va.h"=0A= +=0A= +#include "filters.h"=0A= +#include "scale_eval.h"=0A= +#include "video.h"=0A= +=0A= +typedef struct ScaleD3D11Context {=0A= + const AVClass *classCtx;=0A= + char *w_expr;=0A= + char *h_expr;=0A= + enum AVPixelFormat format;=0A= +=0A= + ///< D3D11 objects=0A= + ID3D11Device *device;=0A= + ID3D11DeviceContext *context;=0A= + ID3D11VideoDevice *videoDevice;=0A= + ID3D11VideoProcessor *processor;=0A= + ID3D11VideoProcessorEnumerator *enumerator;=0A= + ID3D11VideoProcessorOutputView *outputView;=0A= + ID3D11VideoProcessorInputView *inputView;=0A= +=0A= + ///< Buffer references=0A= + AVBufferRef *hw_device_ctx;=0A= + AVBufferRef *hw_frames_ctx_out;=0A= +=0A= + ///< Dimensions and formats=0A= + int width, height;=0A= + int inputWidth, inputHeight;=0A= + DXGI_FORMAT input_format;=0A= + DXGI_FORMAT output_format;=0A= +} ScaleD3D11Context;=0A= +=0A= +static av_cold int scale_d3d11_init(AVFilterContext *ctx) {=0A= + ///< all real work is done in config_props and filter_frame=0A= + return 0;=0A= +}=0A= +=0A= +static void release_d3d11_resources(ScaleD3D11Context *s) {=0A= + if (s->outputView) {=0A= + s->outputView->lpVtbl->Release(s->outputView);=0A= + s->outputView =3D NULL;=0A= + }=0A= +=0A= + if (s->processor) {=0A= + s->processor->lpVtbl->Release(s->processor);=0A= + s->processor =3D NULL;=0A= + }=0A= +=0A= + if (s->enumerator) {=0A= + s->enumerator->lpVtbl->Release(s->enumerator);=0A= + s->enumerator =3D NULL;=0A= + }=0A= +=0A= + if (s->videoDevice) {=0A= + s->videoDevice->lpVtbl->Release(s->videoDevice);=0A= + s->videoDevice =3D NULL;=0A= + }=0A= +}=0A= +=0A= +static int scale_d3d11_configure_processor(ScaleD3D11Context *s, AVFilterC= ontext *ctx) {=0A= + HRESULT hr;=0A= +=0A= + switch (s->format) {=0A= + case AV_PIX_FMT_NV12:=0A= + s->output_format =3D DXGI_FORMAT_NV12;=0A= + break;=0A= + case AV_PIX_FMT_P010:=0A= + s->output_format =3D DXGI_FORMAT_P010;=0A= + break;=0A= + default:=0A= + av_log(ctx, AV_LOG_ERROR, "Invalid output format specified\n")= ;=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + ///< Get D3D11 device and context from hardware device context=0A= + AVHWDeviceContext *hwctx =3D (AVHWDeviceContext *)s->hw_device_ctx->da= ta;=0A= + AVD3D11VADeviceContext *d3d11_hwctx =3D (AVD3D11VADeviceContext *)hwct= x->hwctx;=0A= + s->device =3D d3d11_hwctx->device;=0A= + s->context =3D d3d11_hwctx->device_context;=0A= +=0A= + av_log(ctx, AV_LOG_VERBOSE, "Configuring D3D11 video processor: %dx%d = -> %dx%d\n",=0A= + s->inputWidth, s->inputHeight, s->width, s->height);=0A= +=0A= + ///< Define the video processor content description=0A= + D3D11_VIDEO_PROCESSOR_CONTENT_DESC contentDesc =3D {=0A= + .InputFrameFormat =3D D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE,=0A= + .InputWidth =3D s->inputWidth,=0A= + .InputHeight =3D s->inputHeight,=0A= + .OutputWidth =3D s->width,=0A= + .OutputHeight =3D s->height,=0A= + .Usage =3D D3D11_VIDEO_USAGE_PLAYBACK_NORMAL,=0A= + };=0A= +=0A= + ///< Query video device interface=0A= + hr =3D s->device->lpVtbl->QueryInterface(s->device, &IID_ID3D11VideoDe= vice, (void **)&s->videoDevice);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to get D3D11 video device interf= ace: HRESULT 0x%lX\n", hr);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Create video processor enumerator=0A= + hr =3D s->videoDevice->lpVtbl->CreateVideoProcessorEnumerator(s->video= Device, &contentDesc, &s->enumerator);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to create video processor enumer= ator: HRESULT 0x%lX\n", hr);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Create the video processor=0A= + hr =3D s->videoDevice->lpVtbl->CreateVideoProcessor(s->videoDevice, s-= >enumerator, 0, &s->processor);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to create video processor: HRESU= LT 0x%lX\n", hr);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + av_log(ctx, AV_LOG_VERBOSE, "D3D11 video processor successfully config= ured\n");=0A= + return 0;=0A= +}=0A= +=0A= +static int scale_d3d11_filter_frame(AVFilterLink *inlink, AVFrame *in)=0A= +{=0A= + AVFilterContext *ctx =3D inlink->dst;=0A= + ScaleD3D11Context *s =3D ctx->priv;=0A= + AVFilterLink *outlink =3D ctx->outputs[0];=0A= + ID3D11VideoProcessorInputView *inputView =3D NULL;=0A= + ID3D11VideoContext *videoContext =3D NULL;=0A= + AVFrame *out =3D NULL;=0A= + int ret =3D 0;=0A= + HRESULT hr;=0A= +=0A= + ///< Validate input frame=0A= + if (!in) {=0A= + av_log(ctx, AV_LOG_ERROR, "Null input frame\n");=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + if (!in->hw_frames_ctx) {=0A= + av_log(ctx, AV_LOG_ERROR, "No hardware frames context in input fra= me\n");=0A= + av_frame_free(&in);=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + ///< Verify hardware device contexts=0A= + AVHWFramesContext *frames_ctx =3D (AVHWFramesContext *)in->hw_frames_c= tx->data;=0A= +=0A= + if (!s->hw_device_ctx) {=0A= + av_log(ctx, AV_LOG_ERROR, "Filter hardware device context is unini= tialized\n");=0A= + av_frame_free(&in);=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + AVHWDeviceContext *input_device_ctx =3D (AVHWDeviceContext *)frames_ct= x->device_ref->data;=0A= + AVHWDeviceContext *filter_device_ctx =3D (AVHWDeviceContext *)s->hw_de= vice_ctx->data;=0A= +=0A= + if (input_device_ctx->type !=3D filter_device_ctx->type) {=0A= + av_log(ctx, AV_LOG_ERROR, "Mismatch between input and filter hardw= are device types\n");=0A= + av_frame_free(&in);=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + ///< Allocate output frame=0A= + out =3D av_frame_alloc();=0A= + if (!out) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to allocate output frame\n");=0A= + av_frame_free(&in);=0A= + return AVERROR(ENOMEM);=0A= + }=0A= +=0A= + ret =3D av_hwframe_get_buffer(s->hw_frames_ctx_out, out, 0);=0A= + if (ret < 0) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to get output frame from pool\n"= );=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return ret;=0A= + }=0A= +=0A= + ///< Configure the D3D11 video processor if not already configured=0A= + if (!s->processor) {=0A= + ///< Get info from input texture=0A= + D3D11_TEXTURE2D_DESC textureDesc;=0A= + ID3D11Texture2D *input_texture =3D (ID3D11Texture2D *)in->data[0];= =0A= + input_texture->lpVtbl->GetDesc(input_texture, &textureDesc);=0A= +=0A= + s->inputWidth =3D textureDesc.Width;=0A= + s->inputHeight =3D textureDesc.Height;=0A= + s->input_format =3D textureDesc.Format;=0A= +=0A= + ret =3D scale_d3d11_configure_processor(s, ctx);=0A= + if (ret < 0) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to configure processor\n");= =0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return ret;=0A= + }=0A= + }=0A= +=0A= + ///< Get input texture and prepare input view=0A= + ID3D11Texture2D *d3d11_texture =3D (ID3D11Texture2D *)in->data[0];=0A= + int subIdx =3D (int)(intptr_t)in->data[1];=0A= +=0A= + D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc =3D {=0A= + .FourCC =3D s->input_format,=0A= + .ViewDimension =3D D3D11_VPIV_DIMENSION_TEXTURE2D,=0A= + .Texture2D.ArraySlice =3D subIdx=0A= + };=0A= +=0A= + hr =3D s->videoDevice->lpVtbl->CreateVideoProcessorInputView(=0A= + s->videoDevice, (ID3D11Resource *)d3d11_texture, s->enumerator, &i= nputViewDesc, &inputView);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to create input view: HRESULT 0x= %lX\n", hr);=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Create output view for current texture=0A= + ID3D11Texture2D *output_texture =3D (ID3D11Texture2D *)out->data[0];= =0A= + D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputViewDesc =3D {=0A= + .ViewDimension =3D D3D11_VPOV_DIMENSION_TEXTURE2D,=0A= + .Texture2D =3D { .MipSlice =3D 0 },=0A= + };=0A= +=0A= + hr =3D s->videoDevice->lpVtbl->CreateVideoProcessorOutputView(=0A= + s->videoDevice, (ID3D11Resource *)output_texture, s->enumerator, &= outputViewDesc, &s->outputView);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to create output view: HRESULT 0= x%lX\n", hr);=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Set up processing stream=0A= + D3D11_VIDEO_PROCESSOR_STREAM stream =3D {=0A= + .Enable =3D TRUE,=0A= + .pInputSurface =3D inputView,=0A= + .OutputIndex =3D 0=0A= + };=0A= +=0A= + ///< Get video context=0A= + hr =3D s->context->lpVtbl->QueryInterface(s->context, &IID_ID3D11Video= Context, (void **)&videoContext);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to get video context: HRESULT 0x= %lX\n", hr);=0A= + inputView->lpVtbl->Release(inputView);=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Process the frame=0A= + hr =3D videoContext->lpVtbl->VideoProcessorBlt(videoContext, s->proces= sor, s->outputView, 0, 1, &stream);=0A= + if (FAILED(hr)) {=0A= + av_log(ctx, AV_LOG_ERROR, "VideoProcessorBlt failed: HRESULT 0x%lX= \n", hr);=0A= + videoContext->lpVtbl->Release(videoContext);=0A= + inputView->lpVtbl->Release(inputView);=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return AVERROR_EXTERNAL;=0A= + }=0A= +=0A= + ///< Set up output frame=0A= + ret =3D av_frame_copy_props(out, in);=0A= + if (ret < 0) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to copy frame properties\n");=0A= + videoContext->lpVtbl->Release(videoContext);=0A= + inputView->lpVtbl->Release(inputView);=0A= + av_frame_free(&in);=0A= + av_frame_free(&out);=0A= + return ret;=0A= + }=0A= +=0A= + out->data[0] =3D (uint8_t *)output_texture;=0A= + out->data[1] =3D (uint8_t *)(intptr_t)0;=0A= + out->width =3D s->width;=0A= + out->height =3D s->height;=0A= + out->format =3D AV_PIX_FMT_D3D11;=0A= +=0A= + ///< Clean up resources=0A= + inputView->lpVtbl->Release(inputView);=0A= + videoContext->lpVtbl->Release(videoContext);=0A= + if (s->outputView) {=0A= + s->outputView->lpVtbl->Release(s->outputView);=0A= + s->outputView =3D NULL;=0A= + }=0A= + av_frame_free(&in);=0A= +=0A= + ///< Forward the frame=0A= + return ff_filter_frame(outlink, out);=0A= +}=0A= +=0A= +static int scale_d3d11_config_props(AVFilterLink *outlink)=0A= +{=0A= + AVFilterContext *ctx =3D outlink->src;=0A= + ScaleD3D11Context *s =3D ctx->priv;=0A= + AVFilterLink *inlink =3D ctx->inputs[0];=0A= + FilterLink *inl =3D ff_filter_link(inlink);=0A= + FilterLink *outl =3D ff_filter_link(outlink);=0A= + int ret;=0A= +=0A= + ///< Clean up any previous resources=0A= + release_d3d11_resources(s);=0A= +=0A= + ///< Evaluate output dimensions=0A= + ret =3D ff_scale_eval_dimensions(s, s->w_expr, s->h_expr, inlink, outl= ink, &s->width, &s->height);=0A= + if (ret < 0) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to evaluate dimensions\n");=0A= + return ret;=0A= + }=0A= +=0A= + outlink->w =3D s->width;=0A= + outlink->h =3D s->height;=0A= +=0A= + ///< Validate input hw_frames_ctx=0A= + if (!inl->hw_frames_ctx) {=0A= + av_log(ctx, AV_LOG_ERROR, "No hw_frames_ctx available on input lin= k\n");=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + ///< Propagate hw_frames_ctx to output=0A= + outl->hw_frames_ctx =3D av_buffer_ref(inl->hw_frames_ctx);=0A= + if (!outl->hw_frames_ctx) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to propagate hw_frames_ctx to ou= tput\n");=0A= + return AVERROR(ENOMEM);=0A= + }=0A= +=0A= + ///< Initialize filter's hardware device context=0A= + if (!s->hw_device_ctx) {=0A= + AVHWFramesContext *in_frames_ctx =3D (AVHWFramesContext *)inl->hw_= frames_ctx->data;=0A= + s->hw_device_ctx =3D av_buffer_ref(in_frames_ctx->device_ref);=0A= + if (!s->hw_device_ctx) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to initialize filter hardwar= e device context\n");=0A= + return AVERROR(ENOMEM);=0A= + }=0A= + }=0A= +=0A= + ///< Get D3D11 device and context (but don't initialize processor yet = - done in filter_frame)=0A= + AVHWDeviceContext *hwctx =3D (AVHWDeviceContext *)s->hw_device_ctx->da= ta;=0A= + AVD3D11VADeviceContext *d3d11_hwctx =3D (AVD3D11VADeviceContext *)hwct= x->hwctx;=0A= +=0A= + s->device =3D d3d11_hwctx->device;=0A= + s->context =3D d3d11_hwctx->device_context;=0A= +=0A= + if (!s->device || !s->context) {=0A= + av_log(ctx, AV_LOG_ERROR, "Failed to get valid D3D11 device or con= text\n");=0A= + return AVERROR(EINVAL);=0A= + }=0A= +=0A= + ///< Create new hardware frames context for output=0A= + AVHWFramesContext *in_frames_ctx =3D (AVHWFramesContext *)inl->hw_fram= es_ctx->data;=0A= + s->hw_frames_ctx_out =3D av_hwframe_ctx_alloc(s->hw_device_ctx);=0A= + if (!s->hw_frames_ctx_out)=0A= + return AVERROR(ENOMEM);=0A= +=0A= + AVHWFramesContext *frames_ctx =3D (AVHWFramesContext *)s->hw_frames_ct= x_out->data;=0A= + frames_ctx->format =3D AV_PIX_FMT_D3D11;=0A= + frames_ctx->sw_format =3D s->format;=0A= + frames_ctx->width =3D s->width;=0A= + frames_ctx->height =3D s->height;=0A= + frames_ctx->initial_pool_size =3D 10;=0A= +=0A= + if (ctx->extra_hw_frames > 0)=0A= + frames_ctx->initial_pool_size +=3D ctx->extra_hw_frames;=0A= +=0A= + AVD3D11VAFramesContext *frames_hwctx =3D frames_ctx->hwctx;=0A= + frames_hwctx->MiscFlags =3D 0;=0A= + frames_hwctx->BindFlags =3D D3D11_BIND_RENDER_TARGET | D3D11_BIND_VIDE= O_ENCODER;=0A= +=0A= + ret =3D av_hwframe_ctx_init(s->hw_frames_ctx_out);=0A= + if (ret < 0) {=0A= + av_buffer_unref(&s->hw_frames_ctx_out);=0A= + return ret;=0A= + }=0A= +=0A= + outl->hw_frames_ctx =3D av_buffer_ref(s->hw_frames_ctx_out);=0A= + if (!outl->hw_frames_ctx)=0A= + return AVERROR(ENOMEM);=0A= +=0A= + av_log(ctx, AV_LOG_VERBOSE, "D3D11 scale config: %dx%d -> %dx%d\n",=0A= + inlink->w, inlink->h, outlink->w, outlink->h);=0A= + return 0;=0A= +}=0A= +=0A= +static av_cold void scale_d3d11_uninit(AVFilterContext *ctx) {=0A= + ScaleD3D11Context *s =3D ctx->priv;=0A= +=0A= + ///< Release D3D11 resources=0A= + release_d3d11_resources(s);=0A= +=0A= + ///< Free the hardware device context reference=0A= + av_buffer_unref(&s->hw_frames_ctx_out);=0A= + av_buffer_unref(&s->hw_device_ctx);=0A= +=0A= + ///< Free option strings=0A= + av_freep(&s->w_expr);=0A= + av_freep(&s->h_expr);=0A= +}=0A= +=0A= +static const AVFilterPad scale_d3d11_inputs[] =3D {=0A= + {=0A= + .name =3D "default",=0A= + .type =3D AVMEDIA_TYPE_VIDEO,=0A= + .filter_frame =3D scale_d3d11_filter_frame,=0A= + },=0A= +};=0A= +=0A= +static const AVFilterPad scale_d3d11_outputs[] =3D {=0A= + {=0A= + .name =3D "default",=0A= + .type =3D AVMEDIA_TYPE_VIDEO,=0A= + .config_props =3D scale_d3d11_config_props,=0A= + },=0A= +};=0A= +=0A= +#define OFFSET(x) offsetof(ScaleD3D11Context, x)=0A= +#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)=0A= +=0A= +static const AVOption scale_d3d11_options[] =3D {=0A= + { "width", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING,= {.str =3D "iw"}, .flags =3D FLAGS },=0A= + { "height", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING,= {.str =3D "ih"}, .flags =3D FLAGS },=0A= + { "format", "Output video pixel format", OFFSET(format), AV_OPT_TYPE_P= IXEL_FMT, { .i64 =3D AV_PIX_FMT_NONE }, INT_MIN, INT_MAX, .flags=3DFLAGS },= =0A= + { NULL }=0A= +};=0A= +=0A= +AVFILTER_DEFINE_CLASS(scale_d3d11);=0A= +=0A= +const FFFilter ff_vf_scale_d3d11 =3D {=0A= + .p.name =3D "scale_d3d11",=0A= + .p.description =3D NULL_IF_CONFIG_SMALL("Scale video using Direct3D= 11"),=0A= + .priv_size =3D sizeof(ScaleD3D11Context),=0A= + .p.priv_class =3D &scale_d3d11_class,=0A= + .init =3D scale_d3d11_init,=0A= + .uninit =3D scale_d3d11_uninit,=0A= + FILTER_INPUTS(scale_d3d11_inputs),=0A= + FILTER_OUTPUTS(scale_d3d11_outputs),=0A= + FILTER_SINGLE_PIXFMT(AV_PIX_FMT_D3D11),=0A= + .p.flags =3D AVFILTER_FLAG_HWDEVICE,=0A= + .flags_internal =3D FF_FILTER_FLAG_HWFRAME_AWARE,=0A= +};=0A= \ No newline at end of file=0A= diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c= =0A= index 1a047ce57b..7e122d607f 100644=0A= --- a/libavutil/hwcontext_d3d11va.c=0A= +++ b/libavutil/hwcontext_d3d11va.c=0A= @@ -340,19 +340,30 @@ static int d3d11va_get_buffer(AVHWFramesContext *ctx,= AVFrame *frame)=0A= {=0A= AVD3D11FrameDescriptor *desc;=0A= =0A= - frame->buf[0] =3D av_buffer_pool_get(ctx->pool);=0A= - if (!frame->buf[0])=0A= - return AVERROR(ENOMEM);=0A= -=0A= - desc =3D (AVD3D11FrameDescriptor *)frame->buf[0]->data;=0A= + /**=0A= + * Loop until a buffer becomes available from the pool.=0A= + * In a full hardware pipeline, all buffers may be temporarily in use = by=0A= + * other modules (encoder/filter/decoder). Rather than immediately fai= ling=0A= + * with ENOMEM, we wait for a buffer to be released back to the pool, = which=0A= + * maintains pipeline flow and prevents unnecessary allocation failure= s=0A= + * during normal operation.=0A= + */=0A= + do {=0A= + frame->buf[0] =3D av_buffer_pool_get(ctx->pool);=0A= + if (frame->buf[0]) {=0A= + desc =3D (AVD3D11FrameDescriptor *)frame->buf[0]->data;=0A= + frame->data[0] =3D (uint8_t *)desc->texture;=0A= + frame->data[1] =3D (uint8_t *)desc->index;=0A= + frame->format =3D AV_PIX_FMT_D3D11;=0A= + frame->width =3D ctx->width;=0A= + frame->height =3D ctx->height;=0A= + return 0;=0A= + }=0A= =0A= - frame->data[0] =3D (uint8_t *)desc->texture;=0A= - frame->data[1] =3D (uint8_t *)desc->index;=0A= - frame->format =3D AV_PIX_FMT_D3D11;=0A= - frame->width =3D ctx->width;=0A= - frame->height =3D ctx->height;=0A= + av_usleep(500);=0A= + } while (1);=0A= =0A= - return 0;=0A= + return AVERROR(ENOMEM);=0A= }=0A= =0A= static int d3d11va_transfer_get_formats(AVHWFramesContext *ctx,=0A= -- =0A= 2.34.1=0A= =0A= --_002_PN0P287MB14942AAD2334BBE2044868D6E178APN0P287MB1494INDP_ Content-Type: application/octet-stream; name="v2-0001-avfilter-add-scale_d3d11-filter.patch" Content-Description: v2-0001-avfilter-add-scale_d3d11-filter.patch Content-Disposition: attachment; filename="v2-0001-avfilter-add-scale_d3d11-filter.patch"; size=21345; creation-date="Tue, 24 Jun 2025 07:45:05 GMT"; modification-date="Tue, 24 Jun 2025 07:45:05 GMT" Content-Transfer-Encoding: base64 RnJvbSA1ZTBhNDdhZDY0NTNhM2MwYmZiYzZkNjM3MGEyZTg5NTk1ZjliY2FiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXNoIFNhbnRvc2ggPGRhc2guc2F0aHlhbmFyYXlhbmFuQG11 bHRpY29yZXdhcmVpbmMuY29tPgpEYXRlOiBXZWQsIDExIEp1biAyMDI1IDA1OjI2OjE5IC0wNzAw ClN1YmplY3Q6IFtQQVRDSCB2MiAxLzJdIGF2ZmlsdGVyOiBhZGQgc2NhbGVfZDNkMTEgZmlsdGVy CgpUaGlzIGNvbW1pdCBpbnRyb2R1Y2VzIGEgbmV3IGhhcmR3YXJlLWFjY2VsZXJhdGVkIHZpZGVv IGZpbHRlciwgc2NhbGVfZDNkMTEsCndoaWNoIHBlcmZvcm1zIHNjYWxpbmcgYW5kIGZvcm1hdCBj b252ZXJzaW9uIHVzaW5nIERpcmVjdDNEIDExLiBUaGUgZmlsdGVyIGVuYWJsZXMKZWZmaWNpZW50 IEdQVS1iYXNlZCBzY2FsaW5nIGFuZCBwaXhlbCBmb3JtYXQgY29udmVyc2lvbiAocDAxMCB0byBu djEyKSwgcmVkdWNpbmcKQ1BVIG92ZXJoZWFkIGFuZCBsYXRlbmN5IGluIHZpZGVvIHBpcGVsaW5l cy4KLS0tCiBDaGFuZ2Vsb2cgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBsaWJhdmNvZGVj L2R4dmEyLmMgICAgICAgICAgICB8ICAgMyArCiBsaWJhdmZpbHRlci9NYWtlZmlsZSAgICAgICAg ICB8ICAgMSArCiBsaWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMgICAgICB8ICAgMSArCiBsaWJhdmZp bHRlci92Zl9zY2FsZV9kM2QxMS5jICB8IDQ2NCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBsaWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuYyB8ICAzMyArKy0KIDYgZmlsZXMg Y2hhbmdlZCwgNDkyIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGxpYmF2ZmlsdGVyL3ZmX3NjYWxlX2QzZDExLmMKCmRpZmYgLS1naXQgYS9DaGFuZ2Vs b2cgYi9DaGFuZ2Vsb2cKaW5kZXggNDIxNzQ0OTQzOC4uNTYxMjJlZjU1NSAxMDA2NDQKLS0tIGEv Q2hhbmdlbG9nCisrKyBiL0NoYW5nZWxvZwpAQCAtMTgsNiArMTgsNyBAQCB2ZXJzaW9uIDxuZXh0 PjoKIC0gQVBWIGVuY29kaW5nIHN1cHBvcnQgdGhyb3VnaCBhIGxpYm9wZW5hcHYgd3JhcHBlcgog LSBWVkMgZGVjb2RlciBzdXBwb3J0cyBhbGwgY29udGVudCBvZiBTQ0MgKFNjcmVlbiBDb250ZW50 IENvZGluZyk6CiAgIElCQyAoSW50ZXIgQmxvY2sgQ29weSksIFBhbGV0dGUgTW9kZSBhbmQgQUNU IChBZGFwdGl2ZSBDb2xvciBUcmFuc2Zvcm0KKy0gQWRkIHZmX3NjYWxlX2QzZDExIGZpbHRlcgog CiAKIHZlcnNpb24gNy4xOgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMi5jIGIvbGliYXZj b2RlYy9keHZhMi5jCmluZGV4IDIyZWNkNWFjYWYuLjM3ZGFiNmNkNjggMTAwNjQ0Ci0tLSBhL2xp YmF2Y29kZWMvZHh2YTIuYworKysgYi9saWJhdmNvZGVjL2R4dmEyLmMKQEAgLTY0Nyw2ICs2NDcs OSBAQCBpbnQgZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZj dHgsCiAgICAgICAgIEFWRDNEMTFWQUZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1l c19jdHgtPmh3Y3R4OwogCiAgICAgICAgIGZyYW1lc19od2N0eC0+QmluZEZsYWdzIHw9IEQzRDEx X0JJTkRfREVDT0RFUjsKKyAgICAgICAgaWYgKGZyYW1lc19jdHgtPnN3X2Zvcm1hdCA9PSBBVl9Q SVhfRk1UX05WMTIpIHsKKyAgICAgICAgICAgIGZyYW1lc19od2N0eC0+QmluZEZsYWdzIHw9IEQz RDExX0JJTkRfVklERU9fRU5DT0RFUjsKKyAgICAgICAgfQogICAgIH0KICNlbmRpZgogCmRpZmYg LS1naXQgYS9saWJhdmZpbHRlci9NYWtlZmlsZSBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCmluZGV4 IDk3ZjhmMTcyNzIuLjk1NjEyZDc1M2QgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL01ha2VmaWxl CisrKyBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCkBAIC00NjIsNiArNDYyLDcgQEAgT0JKUy0kKENP TkZJR19ST0JFUlRTX09QRU5DTF9GSUxURVIpICAgICAgICAgKz0gdmZfY29udm9sdXRpb25fb3Bl bmNsLm8gb3BlbmNsLm8KIE9CSlMtJChDT05GSUdfUk9UQVRFX0ZJTFRFUikgICAgICAgICAgICAg ICAgICs9IHZmX3JvdGF0ZS5vCiBPQkpTLSQoQ09ORklHX1NBQl9GSUxURVIpICAgICAgICAgICAg ICAgICAgICArPSB2Zl9zYWIubwogT0JKUy0kKENPTkZJR19TQ0FMRV9GSUxURVIpICAgICAgICAg ICAgICAgICAgKz0gdmZfc2NhbGUubyBzY2FsZV9ldmFsLm8gZnJhbWVzeW5jLm8KK09CSlMtJChD T05GSUdfU0NBTEVfRDNEMTFfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3NjYWxlX2QzZDExLm8g c2NhbGVfZXZhbC5vCiBPQkpTLSQoQ09ORklHX1NDQUxFX0NVREFfRklMVEVSKSAgICAgICAgICAg ICArPSB2Zl9zY2FsZV9jdWRhLm8gc2NhbGVfZXZhbC5vIFwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmX3NjYWxlX2N1ZGEucHR4Lm8gY3VkYS9sb2Fk X2hlbHBlci5vCiBPQkpTLSQoQ09ORklHX1NDQUxFX05QUF9GSUxURVIpICAgICAgICAgICAgICAr PSB2Zl9zY2FsZV9ucHAubyBzY2FsZV9ldmFsLm8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2Fs bGZpbHRlcnMuYyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwppbmRleCAzYmMwNDViMjhmLi5l YzVlMDk0OTRhIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMKKysrIGIvbGli YXZmaWx0ZXIvYWxsZmlsdGVycy5jCkBAIC00MzYsNiArNDM2LDcgQEAgZXh0ZXJuIGNvbnN0IEZG RmlsdGVyIGZmX3ZmX3NjYWxlOwogZXh0ZXJuIGNvbnN0IEZGRmlsdGVyIGZmX3ZmX3ZwcF9hbWY7 CiBleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc3JfYW1mOwogZXh0ZXJuIGNvbnN0IEZGRmls dGVyIGZmX3ZmX3NjYWxlX2N1ZGE7CitleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVf ZDNkMTE7CiBleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVfbnBwOwogZXh0ZXJuIGNv bnN0IEZGRmlsdGVyIGZmX3ZmX3NjYWxlX3FzdjsKIGV4dGVybiBjb25zdCBGRkZpbHRlciBmZl92 Zl9zY2FsZV92YWFwaTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlX2QzZDExLmMg Yi9saWJhdmZpbHRlci92Zl9zY2FsZV9kM2QxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLjBiNzQ3NmRkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92 Zl9zY2FsZV9kM2QxMS5jCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy MDI1IE11bHRpY29yZXdXYXJlLCBJbmMuCisgKgorICogQXV0aG9yczogRGFzaCBTYW50b3NoIDxk YXNoLnNhdGhhbmF0YXlhbmFuQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogICAgICAgICAgU2Fj aGluIDxzYWNoaW4ucHJha2FzaEBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqCisgKiBUaGlzIGZp bGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIu MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K KyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs b25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBG b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNp bmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImNvbXBhdC93MzJkbGZjbi5o IgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRp bC9od2NvbnRleHRfZDNkMTF2YS5oIgorCisjaW5jbHVkZSAiZmlsdGVycy5oIgorI2luY2x1ZGUg InNjYWxlX2V2YWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBTY2Fs ZUQzRDExQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3NDdHg7CisgICAgY2hhciAq d19leHByOworICAgIGNoYXIgKmhfZXhwcjsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0 OworCisgICAgLy8vPCBEM0QxMSBvYmplY3RzCisgICAgSUQzRDExRGV2aWNlICpkZXZpY2U7Cisg ICAgSUQzRDExRGV2aWNlQ29udGV4dCAqY29udGV4dDsKKyAgICBJRDNEMTFWaWRlb0RldmljZSAq dmlkZW9EZXZpY2U7CisgICAgSUQzRDExVmlkZW9Qcm9jZXNzb3IgKnByb2Nlc3NvcjsKKyAgICBJ RDNEMTFWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3IgKmVudW1lcmF0b3I7CisgICAgSUQzRDExVmlk ZW9Qcm9jZXNzb3JPdXRwdXRWaWV3ICpvdXRwdXRWaWV3OworICAgIElEM0QxMVZpZGVvUHJvY2Vz c29ySW5wdXRWaWV3ICppbnB1dFZpZXc7CisKKyAgICAvLy88IEJ1ZmZlciByZWZlcmVuY2VzCisg ICAgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9jdHg7CisgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1l c19jdHhfb3V0OworCisgICAgLy8vPCBEaW1lbnNpb25zIGFuZCBmb3JtYXRzCisgICAgaW50IHdp ZHRoLCBoZWlnaHQ7CisgICAgaW50IGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0OworICAgIERYR0lf Rk9STUFUIGlucHV0X2Zvcm1hdDsKKyAgICBEWEdJX0ZPUk1BVCBvdXRwdXRfZm9ybWF0OworfSBT Y2FsZUQzRDExQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHNjYWxlX2QzZDExX2luaXQo QVZGaWx0ZXJDb250ZXh0ICpjdHgpIHsKKyAgICAvLy88IGFsbCByZWFsIHdvcmsgaXMgZG9uZSBp biBjb25maWdfcHJvcHMgYW5kIGZpbHRlcl9mcmFtZQorICAgIHJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCByZWxlYXNlX2QzZDExX3Jlc291cmNlcyhTY2FsZUQzRDExQ29udGV4dCAqcykgewor ICAgIGlmIChzLT5vdXRwdXRWaWV3KSB7CisgICAgICAgIHMtPm91dHB1dFZpZXctPmxwVnRibC0+ UmVsZWFzZShzLT5vdXRwdXRWaWV3KTsKKyAgICAgICAgcy0+b3V0cHV0VmlldyA9IE5VTEw7Cisg ICAgfQorCisgICAgaWYgKHMtPnByb2Nlc3NvcikgeworICAgICAgICBzLT5wcm9jZXNzb3ItPmxw VnRibC0+UmVsZWFzZShzLT5wcm9jZXNzb3IpOworICAgICAgICBzLT5wcm9jZXNzb3IgPSBOVUxM OworICAgIH0KKworICAgIGlmIChzLT5lbnVtZXJhdG9yKSB7CisgICAgICAgIHMtPmVudW1lcmF0 b3ItPmxwVnRibC0+UmVsZWFzZShzLT5lbnVtZXJhdG9yKTsKKyAgICAgICAgcy0+ZW51bWVyYXRv ciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPnZpZGVvRGV2aWNlKSB7CisgICAgICAgIHMt PnZpZGVvRGV2aWNlLT5scFZ0YmwtPlJlbGVhc2Uocy0+dmlkZW9EZXZpY2UpOworICAgICAgICBz LT52aWRlb0RldmljZSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNjYWxlX2QzZDEx X2NvbmZpZ3VyZV9wcm9jZXNzb3IoU2NhbGVEM0QxMUNvbnRleHQgKnMsIEFWRmlsdGVyQ29udGV4 dCAqY3R4KSB7CisgICAgSFJFU1VMVCBocjsKKworICAgIHN3aXRjaCAocy0+Zm9ybWF0KSB7Cisg ICAgICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICAgICAgcy0+b3V0cHV0X2Zvcm1h dCA9IERYR0lfRk9STUFUX05WMTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBB Vl9QSVhfRk1UX1AwMTA6CisgICAgICAgICAgICBzLT5vdXRwdXRfZm9ybWF0ID0gRFhHSV9GT1JN QVRfUDAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgZm9ybWF0IHNwZWNp ZmllZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKwor ICAgIC8vLzwgR2V0IEQzRDExIGRldmljZSBhbmQgY29udGV4dCBmcm9tIGhhcmR3YXJlIGRldmlj ZSBjb250ZXh0CisgICAgQVZIV0RldmljZUNvbnRleHQgKmh3Y3R4ID0gKEFWSFdEZXZpY2VDb250 ZXh0ICopcy0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0 ICpkM2QxMV9od2N0eCA9IChBVkQzRDExVkFEZXZpY2VDb250ZXh0ICopaHdjdHgtPmh3Y3R4Owor ICAgIHMtPmRldmljZSA9IGQzZDExX2h3Y3R4LT5kZXZpY2U7CisgICAgcy0+Y29udGV4dCA9IGQz ZDExX2h3Y3R4LT5kZXZpY2VfY29udGV4dDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJC T1NFLCAiQ29uZmlndXJpbmcgRDNEMTEgdmlkZW8gcHJvY2Vzc29yOiAlZHglZCAtPiAlZHglZFxu IiwKKyAgICAgICAgICAgcy0+aW5wdXRXaWR0aCwgcy0+aW5wdXRIZWlnaHQsIHMtPndpZHRoLCBz LT5oZWlnaHQpOworCisgICAgLy8vPCBEZWZpbmUgdGhlIHZpZGVvIHByb2Nlc3NvciBjb250ZW50 IGRlc2NyaXB0aW9uCisgICAgRDNEMTFfVklERU9fUFJPQ0VTU09SX0NPTlRFTlRfREVTQyBjb250 ZW50RGVzYyA9IHsKKyAgICAgICAgLklucHV0RnJhbWVGb3JtYXQgPSBEM0QxMV9WSURFT19GUkFN RV9GT1JNQVRfUFJPR1JFU1NJVkUsCisgICAgICAgIC5JbnB1dFdpZHRoID0gcy0+aW5wdXRXaWR0 aCwKKyAgICAgICAgLklucHV0SGVpZ2h0ID0gcy0+aW5wdXRIZWlnaHQsCisgICAgICAgIC5PdXRw dXRXaWR0aCA9IHMtPndpZHRoLAorICAgICAgICAuT3V0cHV0SGVpZ2h0ID0gcy0+aGVpZ2h0LAor ICAgICAgICAuVXNhZ2UgPSBEM0QxMV9WSURFT19VU0FHRV9QTEFZQkFDS19OT1JNQUwsCisgICAg fTsKKworICAgIC8vLzwgUXVlcnkgdmlkZW8gZGV2aWNlIGludGVyZmFjZQorICAgIGhyID0gcy0+ ZGV2aWNlLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHMtPmRldmljZSwgJklJRF9JRDNEMTFWaWRl b0RldmljZSwgKHZvaWQgKiopJnMtPnZpZGVvRGV2aWNlKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkg eworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IEQzRDEx IHZpZGVvIGRldmljZSBpbnRlcmZhY2U6IEhSRVNVTFQgMHglbFhcbiIsIGhyKTsKKyAgICAgICAg cmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8vPCBDcmVhdGUgdmlkZW8g cHJvY2Vzc29yIGVudW1lcmF0b3IKKyAgICBociA9IHMtPnZpZGVvRGV2aWNlLT5scFZ0YmwtPkNy ZWF0ZVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcihzLT52aWRlb0RldmljZSwgJmNvbnRlbnREZXNj LCAmcy0+ZW51bWVyYXRvcik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9n KGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBwcm9jZXNzb3IgZW51 bWVyYXRvcjogSFJFU1VMVCAweCVsWFxuIiwgaHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9F WFRFUk5BTDsKKyAgICB9CisKKyAgICAvLy88IENyZWF0ZSB0aGUgdmlkZW8gcHJvY2Vzc29yCisg ICAgaHIgPSBzLT52aWRlb0RldmljZS0+bHBWdGJsLT5DcmVhdGVWaWRlb1Byb2Nlc3NvcihzLT52 aWRlb0RldmljZSwgcy0+ZW51bWVyYXRvciwgMCwgJnMtPnByb2Nlc3Nvcik7CisgICAgaWYgKEZB SUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRv IGNyZWF0ZSB2aWRlbyBwcm9jZXNzb3I6IEhSRVNVTFQgMHglbFhcbiIsIGhyKTsKKyAgICAgICAg cmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9H X1ZFUkJPU0UsICJEM0QxMSB2aWRlbyBwcm9jZXNzb3Igc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWRc biIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYWxlX2QzZDExX2ZpbHRlcl9m cmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJD b250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTY2FsZUQzRDExQ29udGV4dCAqcyA9IGN0 eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Cisg ICAgSUQzRDExVmlkZW9Qcm9jZXNzb3JJbnB1dFZpZXcgKmlucHV0VmlldyA9IE5VTEw7CisgICAg SUQzRDExVmlkZW9Db250ZXh0ICp2aWRlb0NvbnRleHQgPSBOVUxMOworICAgIEFWRnJhbWUgKm91 dCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgSFJFU1VMVCBocjsKKworICAgIC8vLzwg VmFsaWRhdGUgaW5wdXQgZnJhbWUKKyAgICBpZiAoIWluKSB7CisgICAgICAgIGF2X2xvZyhjdHgs IEFWX0xPR19FUlJPUiwgIk51bGwgaW5wdXQgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZF UlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghaW4tPmh3X2ZyYW1lc19jdHgpIHsKKyAg ICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gaGFyZHdhcmUgZnJhbWVzIGNvbnRl eHQgaW4gaW5wdXQgZnJhbWVcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAg ICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8vPCBWZXJpZnkgaGFy ZHdhcmUgZGV2aWNlIGNvbnRleHRzCisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHgg PSAoQVZIV0ZyYW1lc0NvbnRleHQgKilpbi0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKworICAgIGlm ICghcy0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1Is ICJGaWx0ZXIgaGFyZHdhcmUgZGV2aWNlIGNvbnRleHQgaXMgdW5pbml0aWFsaXplZFxuIik7Cisg ICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFM KTsKKyAgICB9CisKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqaW5wdXRfZGV2aWNlX2N0eCA9IChB VkhXRGV2aWNlQ29udGV4dCAqKWZyYW1lc19jdHgtPmRldmljZV9yZWYtPmRhdGE7CisgICAgQVZI V0RldmljZUNvbnRleHQgKmZpbHRlcl9kZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0ICop cy0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKworICAgIGlmIChpbnB1dF9kZXZpY2VfY3R4LT50eXBl ICE9IGZpbHRlcl9kZXZpY2VfY3R4LT50eXBlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xP R19FUlJPUiwgIk1pc21hdGNoIGJldHdlZW4gaW5wdXQgYW5kIGZpbHRlciBoYXJkd2FyZSBkZXZp Y2UgdHlwZXNcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVy biBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8vPCBBbGxvY2F0ZSBvdXRwdXQgZnJh bWUKKyAgICBvdXQgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghb3V0KSB7CisgICAgICAg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgZnJh bWVcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVS Uk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0ID0gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKHMt Pmh3X2ZyYW1lc19jdHhfb3V0LCBvdXQsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgb3V0cHV0IGZyYW1lIGZy b20gcG9vbFxuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJh bWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLy88IENv bmZpZ3VyZSB0aGUgRDNEMTEgdmlkZW8gcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5IGNvbmZpZ3Vy ZWQKKyAgICBpZiAoIXMtPnByb2Nlc3NvcikgeworICAgICAgICAvLy88IEdldCBpbmZvIGZyb20g aW5wdXQgdGV4dHVyZQorICAgICAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXh0dXJlRGVzYzsK KyAgICAgICAgSUQzRDExVGV4dHVyZTJEICppbnB1dF90ZXh0dXJlID0gKElEM0QxMVRleHR1cmUy RCAqKWluLT5kYXRhWzBdOworICAgICAgICBpbnB1dF90ZXh0dXJlLT5scFZ0YmwtPkdldERlc2Mo aW5wdXRfdGV4dHVyZSwgJnRleHR1cmVEZXNjKTsKKworICAgICAgICBzLT5pbnB1dFdpZHRoID0g dGV4dHVyZURlc2MuV2lkdGg7CisgICAgICAgIHMtPmlucHV0SGVpZ2h0ID0gdGV4dHVyZURlc2Mu SGVpZ2h0OworICAgICAgICBzLT5pbnB1dF9mb3JtYXQgPSB0ZXh0dXJlRGVzYy5Gb3JtYXQ7CisK KyAgICAgICAgcmV0ID0gc2NhbGVfZDNkMTFfY29uZmlndXJlX3Byb2Nlc3NvcihzLCBjdHgpOwor ICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VS Uk9SLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwcm9jZXNzb3JcbiIpOworICAgICAgICAgICAgYXZf ZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAg ICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy88IEdldCBpbnB1 dCB0ZXh0dXJlIGFuZCBwcmVwYXJlIGlucHV0IHZpZXcKKyAgICBJRDNEMTFUZXh0dXJlMkQgKmQz ZDExX3RleHR1cmUgPSAoSUQzRDExVGV4dHVyZTJEICopaW4tPmRhdGFbMF07CisgICAgaW50IHN1 YklkeCA9IChpbnQpKGludHB0cl90KWluLT5kYXRhWzFdOworCisgICAgRDNEMTFfVklERU9fUFJP Q0VTU09SX0lOUFVUX1ZJRVdfREVTQyBpbnB1dFZpZXdEZXNjID0geworICAgICAgICAuRm91ckND ID0gcy0+aW5wdXRfZm9ybWF0LAorICAgICAgICAuVmlld0RpbWVuc2lvbiA9IEQzRDExX1ZQSVZf RElNRU5TSU9OX1RFWFRVUkUyRCwKKyAgICAgICAgLlRleHR1cmUyRC5BcnJheVNsaWNlID0gc3Vi SWR4CisgICAgfTsKKworICAgIGhyID0gcy0+dmlkZW9EZXZpY2UtPmxwVnRibC0+Q3JlYXRlVmlk ZW9Qcm9jZXNzb3JJbnB1dFZpZXcoCisgICAgICAgIHMtPnZpZGVvRGV2aWNlLCAoSUQzRDExUmVz b3VyY2UgKilkM2QxMV90ZXh0dXJlLCBzLT5lbnVtZXJhdG9yLCAmaW5wdXRWaWV3RGVzYywgJmlu cHV0Vmlldyk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZf TE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCB2aWV3OiBIUkVTVUxUIDB4JWxYXG4i LCBocik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJhbWVfZnJl ZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAg Ly8vPCBDcmVhdGUgb3V0cHV0IHZpZXcgZm9yIGN1cnJlbnQgdGV4dHVyZQorICAgIElEM0QxMVRl eHR1cmUyRCAqb3V0cHV0X3RleHR1cmUgPSAoSUQzRDExVGV4dHVyZTJEICopb3V0LT5kYXRhWzBd OworICAgIEQzRDExX1ZJREVPX1BST0NFU1NPUl9PVVRQVVRfVklFV19ERVNDIG91dHB1dFZpZXdE ZXNjID0geworICAgICAgICAuVmlld0RpbWVuc2lvbiA9IEQzRDExX1ZQT1ZfRElNRU5TSU9OX1RF WFRVUkUyRCwKKyAgICAgICAgLlRleHR1cmUyRCA9IHsgLk1pcFNsaWNlID0gMCB9LAorICAgIH07 CisKKyAgICBociA9IHMtPnZpZGVvRGV2aWNlLT5scFZ0YmwtPkNyZWF0ZVZpZGVvUHJvY2Vzc29y T3V0cHV0VmlldygKKyAgICAgICAgcy0+dmlkZW9EZXZpY2UsIChJRDNEMTFSZXNvdXJjZSAqKW91 dHB1dF90ZXh0dXJlLCBzLT5lbnVtZXJhdG9yLCAmb3V0cHV0Vmlld0Rlc2MsICZzLT5vdXRwdXRW aWV3KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0df RVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCB2aWV3OiBIUkVTVUxUIDB4JWxYXG4iLCBo cik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgm b3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8v PCBTZXQgdXAgcHJvY2Vzc2luZyBzdHJlYW0KKyAgICBEM0QxMV9WSURFT19QUk9DRVNTT1JfU1RS RUFNIHN0cmVhbSA9IHsKKyAgICAgICAgLkVuYWJsZSA9IFRSVUUsCisgICAgICAgIC5wSW5wdXRT dXJmYWNlID0gaW5wdXRWaWV3LAorICAgICAgICAuT3V0cHV0SW5kZXggPSAwCisgICAgfTsKKwor ICAgIC8vLzwgR2V0IHZpZGVvIGNvbnRleHQKKyAgICBociA9IHMtPmNvbnRleHQtPmxwVnRibC0+ UXVlcnlJbnRlcmZhY2Uocy0+Y29udGV4dCwgJklJRF9JRDNEMTFWaWRlb0NvbnRleHQsICh2b2lk ICoqKSZ2aWRlb0NvbnRleHQpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xv ZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgdmlkZW8gY29udGV4dDogSFJFU1VM VCAweCVsWFxuIiwgaHIpOworICAgICAgICBpbnB1dFZpZXctPmxwVnRibC0+UmVsZWFzZShpbnB1 dFZpZXcpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIGF2X2ZyYW1lX2Zy ZWUoJm91dCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAg IC8vLzwgUHJvY2VzcyB0aGUgZnJhbWUKKyAgICBociA9IHZpZGVvQ29udGV4dC0+bHBWdGJsLT5W aWRlb1Byb2Nlc3NvckJsdCh2aWRlb0NvbnRleHQsIHMtPnByb2Nlc3Nvciwgcy0+b3V0cHV0Vmll dywgMCwgMSwgJnN0cmVhbSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9n KGN0eCwgQVZfTE9HX0VSUk9SLCAiVmlkZW9Qcm9jZXNzb3JCbHQgZmFpbGVkOiBIUkVTVUxUIDB4 JWxYXG4iLCBocik7CisgICAgICAgIHZpZGVvQ29udGV4dC0+bHBWdGJsLT5SZWxlYXNlKHZpZGVv Q29udGV4dCk7CisgICAgICAgIGlucHV0Vmlldy0+bHBWdGJsLT5SZWxlYXNlKGlucHV0Vmlldyk7 CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0 KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8vPCBT ZXQgdXAgb3V0cHV0IGZyYW1lCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGlu KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1Is ICJGYWlsZWQgdG8gY29weSBmcmFtZSBwcm9wZXJ0aWVzXG4iKTsKKyAgICAgICAgdmlkZW9Db250 ZXh0LT5scFZ0YmwtPlJlbGVhc2UodmlkZW9Db250ZXh0KTsKKyAgICAgICAgaW5wdXRWaWV3LT5s cFZ0YmwtPlJlbGVhc2UoaW5wdXRWaWV3KTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwor ICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0K KworICAgIG91dC0+ZGF0YVswXSA9ICh1aW50OF90ICopb3V0cHV0X3RleHR1cmU7CisgICAgb3V0 LT5kYXRhWzFdID0gKHVpbnQ4X3QgKikoaW50cHRyX3QpMDsKKyAgICBvdXQtPndpZHRoID0gcy0+ d2lkdGg7CisgICAgb3V0LT5oZWlnaHQgPSBzLT5oZWlnaHQ7CisgICAgb3V0LT5mb3JtYXQgPSBB Vl9QSVhfRk1UX0QzRDExOworCisgICAgLy8vPCBDbGVhbiB1cCByZXNvdXJjZXMKKyAgICBpbnB1 dFZpZXctPmxwVnRibC0+UmVsZWFzZShpbnB1dFZpZXcpOworICAgIHZpZGVvQ29udGV4dC0+bHBW dGJsLT5SZWxlYXNlKHZpZGVvQ29udGV4dCk7CisgICAgaWYgKHMtPm91dHB1dFZpZXcpIHsKKyAg ICAgICAgcy0+b3V0cHV0Vmlldy0+bHBWdGJsLT5SZWxlYXNlKHMtPm91dHB1dFZpZXcpOworICAg ICAgICBzLT5vdXRwdXRWaWV3ID0gTlVMTDsKKyAgICB9CisgICAgYXZfZnJhbWVfZnJlZSgmaW4p OworCisgICAgLy8vPCBGb3J3YXJkIHRoZSBmcmFtZQorICAgIHJldHVybiBmZl9maWx0ZXJfZnJh bWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGludCBzY2FsZV9kM2QxMV9jb25maWdfcHJv cHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0g b3V0bGluay0+c3JjOworICAgIFNjYWxlRDNEMTFDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAg IEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgRmlsdGVyTGluayAq aW5sID0gZmZfZmlsdGVyX2xpbmsoaW5saW5rKTsKKyAgICBGaWx0ZXJMaW5rICpvdXRsID0gZmZf ZmlsdGVyX2xpbmsob3V0bGluayk7CisgICAgaW50IHJldDsKKworICAgIC8vLzwgQ2xlYW4gdXAg YW55IHByZXZpb3VzIHJlc291cmNlcworICAgIHJlbGVhc2VfZDNkMTFfcmVzb3VyY2VzKHMpOwor CisgICAgLy8vPCBFdmFsdWF0ZSBvdXRwdXQgZGltZW5zaW9ucworICAgIHJldCA9IGZmX3NjYWxl X2V2YWxfZGltZW5zaW9ucyhzLCBzLT53X2V4cHIsIHMtPmhfZXhwciwgaW5saW5rLCBvdXRsaW5r LCAmcy0+d2lkdGgsICZzLT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2 X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBldmFsdWF0ZSBkaW1lbnNpb25zXG4i KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBvdXRsaW5rLT53ID0gcy0+d2lk dGg7CisgICAgb3V0bGluay0+aCA9IHMtPmhlaWdodDsKKworICAgIC8vLzwgVmFsaWRhdGUgaW5w dXQgaHdfZnJhbWVzX2N0eAorICAgIGlmICghaW5sLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAg IGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGh3X2ZyYW1lc19jdHggYXZhaWxhYmxlIG9u IGlucHV0IGxpbmtcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0K KworICAgIC8vLzwgUHJvcGFnYXRlIGh3X2ZyYW1lc19jdHggdG8gb3V0cHV0CisgICAgb3V0bC0+ aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaW5sLT5od19mcmFtZXNfY3R4KTsKKyAgICBp ZiAoIW91dGwtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VS Uk9SLCAiRmFpbGVkIHRvIHByb3BhZ2F0ZSBod19mcmFtZXNfY3R4IHRvIG91dHB1dFxuIik7Cisg ICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLy8vPCBJbml0aWFs aXplIGZpbHRlcidzIGhhcmR3YXJlIGRldmljZSBjb250ZXh0CisgICAgaWYgKCFzLT5od19kZXZp Y2VfY3R4KSB7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICppbl9mcmFtZXNfY3R4ID0gKEFW SFdGcmFtZXNDb250ZXh0ICopaW5sLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBzLT5o d19kZXZpY2VfY3R4ID0gYXZfYnVmZmVyX3JlZihpbl9mcmFtZXNfY3R4LT5kZXZpY2VfcmVmKTsK KyAgICAgICAgaWYgKCFzLT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4 LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaWx0ZXIgaGFyZHdhcmUgZGV2 aWNlIGNvbnRleHRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAg ICAgICAgfQorICAgIH0KKworICAgIC8vLzwgR2V0IEQzRDExIGRldmljZSBhbmQgY29udGV4dCAo YnV0IGRvbid0IGluaXRpYWxpemUgcHJvY2Vzc29yIHlldCAtIGRvbmUgaW4gZmlsdGVyX2ZyYW1l KQorICAgIEFWSFdEZXZpY2VDb250ZXh0ICpod2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCAqKXMt Pmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqZDNkMTFf aHdjdHggPSAoQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqKWh3Y3R4LT5od2N0eDsKKworICAgIHMt PmRldmljZSA9IGQzZDExX2h3Y3R4LT5kZXZpY2U7CisgICAgcy0+Y29udGV4dCA9IGQzZDExX2h3 Y3R4LT5kZXZpY2VfY29udGV4dDsKKworICAgIGlmICghcy0+ZGV2aWNlIHx8ICFzLT5jb250ZXh0 KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgdmFs aWQgRDNEMTEgZGV2aWNlIG9yIGNvbnRleHRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihF SU5WQUwpOworICAgIH0KKworICAgIC8vLzwgQ3JlYXRlIG5ldyBoYXJkd2FyZSBmcmFtZXMgY29u dGV4dCBmb3Igb3V0cHV0CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmluX2ZyYW1lc19jdHggPSAo QVZIV0ZyYW1lc0NvbnRleHQgKilpbmwtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgcy0+aHdf ZnJhbWVzX2N0eF9vdXQgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhzLT5od19kZXZpY2VfY3R4KTsK KyAgICBpZiAoIXMtPmh3X2ZyYW1lc19jdHhfb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihF Tk9NRU0pOworCisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1l c0NvbnRleHQgKilzLT5od19mcmFtZXNfY3R4X291dC0+ZGF0YTsKKyAgICBmcmFtZXNfY3R4LT5m b3JtYXQgPSBBVl9QSVhfRk1UX0QzRDExOworICAgIGZyYW1lc19jdHgtPnN3X2Zvcm1hdCA9IHMt PmZvcm1hdDsKKyAgICBmcmFtZXNfY3R4LT53aWR0aCA9IHMtPndpZHRoOworICAgIGZyYW1lc19j dHgtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6 ZSA9IDEwOworCisgICAgaWYgKGN0eC0+ZXh0cmFfaHdfZnJhbWVzID4gMCkKKyAgICAgICAgZnJh bWVzX2N0eC0+aW5pdGlhbF9wb29sX3NpemUgKz0gY3R4LT5leHRyYV9od19mcmFtZXM7CisKKyAg ICBBVkQzRDExVkFGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0 eDsKKyAgICBmcmFtZXNfaHdjdHgtPk1pc2NGbGFncyA9IDA7CisgICAgZnJhbWVzX2h3Y3R4LT5C aW5kRmxhZ3MgPSBEM0QxMV9CSU5EX1JFTkRFUl9UQVJHRVQgfCBEM0QxMV9CSU5EX1ZJREVPX0VO Q09ERVI7CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX2N0eF9pbml0KHMtPmh3X2ZyYW1lc19jdHhf b3V0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPmh3 X2ZyYW1lc19jdHhfb3V0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBvdXRs LT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihzLT5od19mcmFtZXNfY3R4X291dCk7Cisg ICAgaWYgKCFvdXRsLT5od19mcmFtZXNfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9N RU0pOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJEM0QxMSBzY2FsZSBjb25m aWc6ICVkeCVkIC0+ICVkeCVkXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwg b3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9j b2xkIHZvaWQgc2NhbGVfZDNkMTFfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KSB7CisgICAg U2NhbGVEM0QxMUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICAvLy88IFJlbGVhc2UgRDNE MTEgcmVzb3VyY2VzCisgICAgcmVsZWFzZV9kM2QxMV9yZXNvdXJjZXMocyk7CisKKyAgICAvLy88 IEZyZWUgdGhlIGhhcmR3YXJlIGRldmljZSBjb250ZXh0IHJlZmVyZW5jZQorICAgIGF2X2J1ZmZl cl91bnJlZigmcy0+aHdfZnJhbWVzX2N0eF9vdXQpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+ aHdfZGV2aWNlX2N0eCk7CisKKyAgICAvLy88IEZyZWUgb3B0aW9uIHN0cmluZ3MKKyAgICBhdl9m cmVlcCgmcy0+d19leHByKTsKKyAgICBhdl9mcmVlcCgmcy0+aF9leHByKTsKK30KKworc3RhdGlj IGNvbnN0IEFWRmlsdGVyUGFkIHNjYWxlX2QzZDExX2lucHV0c1tdID0geworICAgIHsKKyAgICAg ICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFW TUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IHNjYWxlX2QzZDExX2Zp bHRlcl9mcmFtZSwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNjYWxl X2QzZDExX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVm YXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAg ICAgIC5jb25maWdfcHJvcHMgPSBzY2FsZV9kM2QxMV9jb25maWdfcHJvcHMsCisgICAgfSwKK307 CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNjYWxlRDNEMTFDb250ZXh0LCB4KQorI2Rl ZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklE RU9fUEFSQU0pCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzY2FsZV9kM2QxMV9vcHRpb25zW10g PSB7CisgICAgeyAid2lkdGgiLCAgIk91dHB1dCB2aWRlbyB3aWR0aCIsICBPRkZTRVQod19leHBy KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpdyJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAor ICAgIHsgImhlaWdodCIsICJPdXRwdXQgdmlkZW8gaGVpZ2h0IiwgT0ZGU0VUKGhfZXhwciksIEFW X09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiaWgifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7 ICJmb3JtYXQiLCAiT3V0cHV0IHZpZGVvIHBpeGVsIGZvcm1hdCIsIE9GRlNFVChmb3JtYXQpLCBB Vl9PUFRfVFlQRV9QSVhFTF9GTVQsIHsgLmk2NCA9IEFWX1BJWF9GTVRfTk9ORSB9LCBJTlRfTUlO LCBJTlRfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJf REVGSU5FX0NMQVNTKHNjYWxlX2QzZDExKTsKKworY29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVf ZDNkMTEgPSB7CisgICAgLnAubmFtZSAgICAgICAgICAgPSAic2NhbGVfZDNkMTEiLAorICAgIC5w LmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNjYWxlIHZpZGVvIHVzaW5n IERpcmVjdDNEMTEiKSwKKyAgICAucHJpdl9zaXplICAgICAgICA9IHNpemVvZihTY2FsZUQzRDEx Q29udGV4dCksCisgICAgLnAucHJpdl9jbGFzcyAgICAgPSAmc2NhbGVfZDNkMTFfY2xhc3MsCisg ICAgLmluaXQgICAgICAgICAgICAgPSBzY2FsZV9kM2QxMV9pbml0LAorICAgIC51bmluaXQgICAg ICAgICAgID0gc2NhbGVfZDNkMTFfdW5pbml0LAorICAgIEZJTFRFUl9JTlBVVFMoc2NhbGVfZDNk MTFfaW5wdXRzKSwKKyAgICBGSUxURVJfT1VUUFVUUyhzY2FsZV9kM2QxMV9vdXRwdXRzKSwKKyAg ICBGSUxURVJfU0lOR0xFX1BJWEZNVChBVl9QSVhfRk1UX0QzRDExKSwKKyAgICAucC5mbGFncyAg ICAgICAgICA9IEFWRklMVEVSX0ZMQUdfSFdERVZJQ0UsCisgICAgLmZsYWdzX2ludGVybmFsICAg PSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBv ZiBmaWxlCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuYyBiL2xpYmF2 dXRpbC9od2NvbnRleHRfZDNkMTF2YS5jCmluZGV4IDFhMDQ3Y2U1N2IuLjdlMTIyZDYwN2YgMTAw NjQ0Ci0tLSBhL2xpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5jCisrKyBiL2xpYmF2dXRpbC9o d2NvbnRleHRfZDNkMTF2YS5jCkBAIC0zNDAsMTkgKzM0MCwzMCBAQCBzdGF0aWMgaW50IGQzZDEx dmFfZ2V0X2J1ZmZlcihBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKIHsK ICAgICBBVkQzRDExRnJhbWVEZXNjcmlwdG9yICpkZXNjOwogCi0gICAgZnJhbWUtPmJ1ZlswXSA9 IGF2X2J1ZmZlcl9wb29sX2dldChjdHgtPnBvb2wpOwotICAgIGlmICghZnJhbWUtPmJ1ZlswXSkK LSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGRlc2MgPSAoQVZEM0QxMUZy YW1lRGVzY3JpcHRvciAqKWZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgLyoqCisgICAgICogTG9v cCB1bnRpbCBhIGJ1ZmZlciBiZWNvbWVzIGF2YWlsYWJsZSBmcm9tIHRoZSBwb29sLgorICAgICAq IEluIGEgZnVsbCBoYXJkd2FyZSBwaXBlbGluZSwgYWxsIGJ1ZmZlcnMgbWF5IGJlIHRlbXBvcmFy aWx5IGluIHVzZSBieQorICAgICAqIG90aGVyIG1vZHVsZXMgKGVuY29kZXIvZmlsdGVyL2RlY29k ZXIpLiBSYXRoZXIgdGhhbiBpbW1lZGlhdGVseSBmYWlsaW5nCisgICAgICogd2l0aCBFTk9NRU0s IHdlIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wsIHdo aWNoCisgICAgICogbWFpbnRhaW5zIHBpcGVsaW5lIGZsb3cgYW5kIHByZXZlbnRzIHVubmVjZXNz YXJ5IGFsbG9jYXRpb24gZmFpbHVyZXMKKyAgICAgKiBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbi4K KyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9v bF9nZXQoY3R4LT5wb29sKTsKKyAgICAgICAgaWYgKGZyYW1lLT5idWZbMF0pIHsKKyAgICAgICAg ICAgIGRlc2MgPSAoQVZEM0QxMUZyYW1lRGVzY3JpcHRvciAqKWZyYW1lLT5idWZbMF0tPmRhdGE7 CisgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXSA9ICh1aW50OF90ICopZGVzYy0+dGV4dHVyZTsK KyAgICAgICAgICAgIGZyYW1lLT5kYXRhWzFdID0gKHVpbnQ4X3QgKilkZXNjLT5pbmRleDsKKyAg ICAgICAgICAgIGZyYW1lLT5mb3JtYXQgID0gQVZfUElYX0ZNVF9EM0QxMTsKKyAgICAgICAgICAg IGZyYW1lLT53aWR0aCAgID0gY3R4LT53aWR0aDsKKyAgICAgICAgICAgIGZyYW1lLT5oZWlnaHQg ID0gY3R4LT5oZWlnaHQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCi0gICAg ZnJhbWUtPmRhdGFbMF0gPSAodWludDhfdCAqKWRlc2MtPnRleHR1cmU7Ci0gICAgZnJhbWUtPmRh dGFbMV0gPSAodWludDhfdCAqKWRlc2MtPmluZGV4OwotICAgIGZyYW1lLT5mb3JtYXQgID0gQVZf UElYX0ZNVF9EM0QxMTsKLSAgICBmcmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7Ci0gICAgZnJh bWUtPmhlaWdodCAgPSBjdHgtPmhlaWdodDsKKyAgICAgICAgYXZfdXNsZWVwKDUwMCk7CisgICAg fSB3aGlsZSAoMSk7CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0p OwogfQogCiBzdGF0aWMgaW50IGQzZDExdmFfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMoQVZIV0ZyYW1l c0NvbnRleHQgKmN0eCwKLS0gCjIuMzQuMQoK --_002_PN0P287MB14942AAD2334BBE2044868D6E178APN0P287MB1494INDP_ 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". --_002_PN0P287MB14942AAD2334BBE2044868D6E178APN0P287MB1494INDP_--