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 06D2F4AB7C for ; Sun, 20 Jul 2025 09:15:48 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 9385068CFA2; Sun, 20 Jul 2025 12:15:43 +0300 (EEST) Received: from MA0PR01CU012.outbound.protection.outlook.com (mail-southindiaazon11021091.outbound.protection.outlook.com [40.107.57.91]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 334FD68CCF4 for ; Sun, 20 Jul 2025 12:15:36 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TAKZ/TJF38sJpiR/XKykS5hukG8oyP3UEWqIwi7qHbhGSmiIn4xr4urPPc2+bq8DShZsqB1msASDV7tkkbBGSrrW1sdtCVCYK1f4JRHMsDRlpGQ58OUrhZlkfrAkjMSYF4F7+rLgnoxSxVbXq/kSQIkjcnssL+kgENgauI4h9a/pJW8pbTTE3n/Bv7W4gMGShil3FVTv/7sGNzluJMfpcmfO9kj2MJ1nlLv5Qb8Dfp2kHf+S+lgb8/E0b02L7wCxqm202kKTKwPO6zhj+89hkghgN9cvqBqFK/tUKjOORgqMz4bemUrUd1EXS7RQnc8X3tf5bAttP+A2S7hTtoeofg== 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=e7nizXW4G3/t/XjcRYZ21uuagnweZYaZ6qhD4H0wGik=; b=BEMdKl3k4uWHpohXJq79lNHpNV/01M9tAZvcuzv01kaF5t6c3PFeh2OjO+fy6wVo4Ziyywc8FMYSgxnqMAh0DUelJN60n3ndQMfJoSDdFVkoe4jMZMwCbbEsVR7xkdaWG9j7csGe8X52dFZw+J0KsqndSi3EaF39GhzFE/iH4VS7pVOMaiZRY48yKuGAJMUxWmiGnwZ4EjYQN2A09OOlGlY7OZHRRzssM4jzYpCVjMgbLNfU7j4dti/hP1+60u+QXtWMlshXXN6ygxNHjA2SzO0zXrY5htA209OscXEcsoYQW2pceZIYrAlICqW8jX6AYZuV+792jTDO5M6eaxpMgw== 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=e7nizXW4G3/t/XjcRYZ21uuagnweZYaZ6qhD4H0wGik=; b=puocQsptOJw5amJlVLoIC0dXxNNUK7ihk0o6gci2ZnaXYmKSWXelcUNkxlXsVYAPKQ1mFrrzG1ItCGxiLVsWvU3JI9ncIW5INQJJuvfWNvAPuyokwA5k9A2qo24gvnVNyWPDmLnBiPI/ZvF1AHAaKoJBjk7cyUuQypG9YkBBRzl09/6hoNupdjOx0WzwIA5mkmcAVOA/0ebVth9ABoaXnvbrbRfa8rP4MWWA+4C+6tno9Bv8+ZPq6dQPAt/GOToDXumUBycEV/0X9eG2xjyXluOamamuYbdk6qwJyT3PJJ9cVUHQ8hldNM3OQlYOsQIwf4VZtRYYclLZAxbIfvEMKQ== Received: from PN0P287MB1494.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:186::9) by PN2P287MB2157.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1c1::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8943.30; Sun, 20 Jul 2025 09:15:31 +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.8943.029; Sun, 20 Jul 2025 09:15:31 +0000 From: Dash Santosh Sathyanarayanan To: FFmpeg development discussions and patches Thread-Topic: [PATCH v5 1/2] avfilter: add scale_d3d11 filter Thread-Index: AQHb+VRLc3eu0lg1F02tV5JuFNc/+A== Date: Sun, 20 Jul 2025 09:15:31 +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_|PN2P287MB2157:EE_ x-ms-office365-filtering-correlation-id: ef40973d-4201-4e57-b1c3-08ddc76df9f1 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|1800799024|376014|366016|10070799003|4053099003|38070700018; x-microsoft-antispam-message-info: =?Windows-1252?Q?pF2m0X10abwR8RIVuwdwLZ5iNAFsdDhP85hh3PzSY1Khx0nNap/Zbed2?= =?Windows-1252?Q?2ArQ1mNHdL4mk3km3u2vCkI40k/ZgdSnlO7czRBziL/JhGKwrPSjft8l?= =?Windows-1252?Q?KOXoHoFuPm0HNf1pcUNdC5WHjRxP3uk1Icjswo+ipoorA5ziYvdi7Pmv?= =?Windows-1252?Q?XtmUokBPEZLNSWkPQp88zae7T/oXkkFm9X8dsfHVQCugW7TGuOe8TeWs?= =?Windows-1252?Q?eMFeSCM1QvyR8JEKVh/Pski4BjjU8jMrr9F7c+MaY8D4ctlV9Ltuammn?= =?Windows-1252?Q?15koT3thZBHFjOn2q5zk95YnrYc6Rph5EL4HkDPeYqBA3bJtCjmGDIoh?= =?Windows-1252?Q?tu+NYwJvI7/roHMjalH1ksOOhH7MVD1+3JajYNMQwqk8dZ5SAkWzZEoe?= =?Windows-1252?Q?gsBW4kNerC7CIAETEvEtmxSH78f6q1qAZCsFiEEuFIZ65Brrk3OUazvp?= =?Windows-1252?Q?twNJlIynqBHyORd+hcvHa5l16RPw+wp+RCQjNR0evTxY9vJAj/Az+d1y?= =?Windows-1252?Q?4Z86uIABGoPd+qCrUunB/hDHcAjFn9mUa5LnX7IZySpUbXo+5zTEkeXU?= =?Windows-1252?Q?1qpDumvuYeaCGPIGIYNAPbIb2jSNRHEK1aylPpqUF/PCERp+rf/dBxgl?= =?Windows-1252?Q?ekQfFvFwzEs7yvslxCs7N4lhf+0rS34TxxUYx2Op7TuwQBCdwrpq8sXW?= =?Windows-1252?Q?W91pXWwCMP4UOnMRM2xrgZrmldBQyUIPI/glUz78/yYHAdmmSS5uDEmi?= =?Windows-1252?Q?Bdx3l44QDrSoDQDsylzuy6SgW7fXv7s+kD7BSQGud641LzWUsyjThy7M?= =?Windows-1252?Q?qKH/Su4gt8ef2UU58r3fHULqiKV62rqUUyWgZEf5SXpCkp0kvRaIjU8z?= =?Windows-1252?Q?xLAoEog1obMpl3etjVKBIXhMyKCknQwOSLm0ezGTZxMXPEK60wV9fCOw?= =?Windows-1252?Q?VBiDfdM7c4mUA4nYjNYMayYKVrpcSn+nLhNWRgA74mt62aZq0UzaGgK8?= =?Windows-1252?Q?TlD1OmqCAq+WWdzDHBhfRSkXm4D6CekZky6SsWYkf1qVJooUC8fKNing?= =?Windows-1252?Q?3I7tBqTVIxo7/BxGQvoCyAQWTUS5rDLbUa07wcU1ouzv6xv78fCXzHCM?= =?Windows-1252?Q?mxjlBd65bLFJ7t0u2azrvmZPAf4qqB9ii57ScMYNkLOynoNfPgJ2EOlH?= =?Windows-1252?Q?R0lWUswRkO6DJoOd56293BArdHoomODbH0TibqSNfiDYl+02hob8K9kV?= =?Windows-1252?Q?2xIgR8fK+gN5JGSBB+EHtddQeyoZwhR5lyAx/hVEBOVgEhSB2hCQlnGn?= =?Windows-1252?Q?Oj4fJw+217Qds6mT8S2wjjwNtz5RfvyzEKtyHBoVLZKk1gOjvEV/MgH1?= =?Windows-1252?Q?tzusjUFbopVgh8n9SS+awMXudd0AsAXZ924xp6Clkjvd4GBIWL225C3i?= =?Windows-1252?Q?86M/UhfHPLjdsyYOkfGepm3Ymj1/jzNI8TX0OLmbDzy3yNyAf0pTthuf?= =?Windows-1252?Q?LVk6F++3yYn2tk1dE/GUhqJ2cih/diz7k/vxhwGfY60LHfSvwig=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)(376014)(366016)(10070799003)(4053099003)(38070700018); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?Windows-1252?Q?k7TBb2lJ5OPAiEqsVNSW/0G3DMsKLPW0tHbWa9mTrW45tsDpFPpAsUFH?= =?Windows-1252?Q?HQZy9F66scZIDK9RG8UroosRNConCpupyhoV8885nJ5hkd6WYtNRDiTX?= =?Windows-1252?Q?bdpTlHhgXzI9D5W48o3NKOW3oNxOifBv3uBF10VrKXcdsRlWYsjZ56Tj?= =?Windows-1252?Q?ouWqg9jIs0Z6hNUWHKGNPrg5bD79TrBToL4OETbUFotNWsCVSMGZ6mH4?= =?Windows-1252?Q?QLRK0epl+iC/XnQuY3Aj+NLQJNwhpGaXlFf0ZD1KUGv2CoJpoCfeECXP?= =?Windows-1252?Q?R45lqpcVq6fwp4EB+uBtg/Np9U4Wa9TPAcdCIhLeBAnzWvuguoPFzqDY?= =?Windows-1252?Q?sLIDE3vlxRriOh/FziypFg1/AY8FIpd2iI3lCTemHu3iJAGR3fs4cHhV?= =?Windows-1252?Q?8In1Yq0MnRDLuZA30/G0uw9lgk5I1MMSxK0FqaKKyu99EoVZ93uz9PR6?= =?Windows-1252?Q?lYUTfCEYDPj5IzPnaNGs66trf2tWFpDNUckARwpSl/OWMnW90DQD38r7?= =?Windows-1252?Q?J5rD/s5Lgb4Wt2PduG1eTLoIBpo8zEWrWvXsot9r16udQp97E0lwcYvN?= =?Windows-1252?Q?Y4N6UfnT9Becy3edylPNa2zYKinMLf5CljntRtQajkdKLd1HiDRWEQjY?= =?Windows-1252?Q?mvr3GFwnNRUbgQV94b5ByOVR7ijvHihLeQgRECojxkRuP0ok1/ihmYCJ?= =?Windows-1252?Q?RG4HdCY4eAlbETGFAa4y6WPC+0xQeTMAl6iVHPsgfvwxygaJgu4Bj2mt?= =?Windows-1252?Q?j7XHT0BQwIPJsclCSKlc+ZmB8kSD6LUUpKX4b/LaUZ2XPX5S7DMmgL5w?= =?Windows-1252?Q?LIaoX3YCUcxVR+/deEnT96hhTFxr6qypvDrXdJSzJtHWssAIXvYp2oT9?= =?Windows-1252?Q?hX10jMEJGYXwzcUZJaxD0AVJvzUA4AmKh3SzT70gQgOHqCB0uL6c1U0H?= =?Windows-1252?Q?3Qeg64kIdTsRNk7mBuOogZASELiQNKhcW93HAkPeCQ2sSamf71fyzo6/?= =?Windows-1252?Q?VswKG0IX6CY9JxS74v6Wdl1Ok4PmUQDq/eGHV4HjiGTKmD7UYm/HQ3Hs?= =?Windows-1252?Q?qxN6X57NUQaMhBSBNc7i94H9p7rPqVEB5+YOhZi5wyE8Z9OYwQ176jo0?= =?Windows-1252?Q?Vl+LTEeY3KTWQ9mJLkvdqUykbJ/r9ibXSFFYtWix+xsJaBUGsS+X7iKa?= =?Windows-1252?Q?ySq2FlrA3IkwnSCta8T1v2fTxU6VM1xD69LigyBPwMH6mNfNJ8IK4L4n?= =?Windows-1252?Q?IrjkJLJR99YtmNd+K8FCaAXZJuvDULymvgneiAMsrOPDzEyPqVzAfFJz?= =?Windows-1252?Q?eq3vYpU+CylMaNkieicvN+92cSNJZ89qBHuqZNgEZzQXmVO+4sIDJSf/?= =?Windows-1252?Q?oZhfOhjahYvRd8Qfne5rJv3oS/O/a7D1AwYR0BlY9LFAd5bL2lwu2Zfk?= =?Windows-1252?Q?r6AwuGRKs6u2FvYlcYMc8BWBDgXREiox62djK7pKAnGMHvIHgehTxL6n?= =?Windows-1252?Q?JmR/9lMx01wJSG1yYMgkozrtpYcuSm6zymQDLFQzOXuvm0Gnz4lm1+QV?= =?Windows-1252?Q?JCa1VZwZwwu5B7CukTGMUswoxqV69uV1H9IBXiaMzQd3rsqYrJN/iPtx?= =?Windows-1252?Q?twpSLtJShtRHz77iYSD9K2zP0MVz4mvQBkBxrm8mbm0FPbGMWtoeW6Zv?= =?Windows-1252?Q?pezdmDR9ElbNHy4xILYHUAa8EcfuFkuIj1eEq3/Eh0NDUP4T+pU8/anu?= =?Windows-1252?Q?wA1oTZUnpMz+/fIER6H3AeoVBu5R9vu2lJRrvZxHojE5mVlriN5YsogP?= =?Windows-1252?Q?Ta4BXPB9aWDGwQyb1XkJnB+vOVs=3D?= Content-Type: multipart/mixed; boundary="_002_PN0P287MB1494A6A5E06359341A401342E152APN0P287MB1494INDP_" 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: ef40973d-4201-4e57-b1c3-08ddc76df9f1 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Jul 2025 09:15:31.5146 (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: J5HP32R9Id7wNMbzorLrl69PPnFa1JG0Xu5AWm7RyYSSs11+o3UnE9plqCfGpMlJ0cjAabCry2ui2yfRaC+THiytxGOy4gRwCtZebu5Smpu9GX3tzb9eXerf6lSXTIPtV4H18u7IakVtgJpFVRQ+ew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN2P287MB2157 Subject: [FFmpeg-devel] [PATCH v5 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_PN0P287MB1494A6A5E06359341A401342E152APN0P287MB1494INDP_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Regarding the while loop in hwcontext_d3d11va get_buffer, I understand=0A= the concern about introducing an unbounded wait. However, there have been= =0A= a couple of issues reported in the past that highlight this problem:=0A= =0A= - https://lists.ffmpeg.org/pipermail/libav-user/2024-March/013469.html =0A= - https://lists.ffmpeg.org/pipermail/ffmpeg-trac/2023-October/067420.html= =0A= =0A= In both the cases, the error reported was: "static surface pool size exceed= ed".=0A= The suggested workaround was to increase extra_hw_frames, but in practice,= =0A= this isn't always feasible. But in practice, for decoder-bound D3D11 resour= ces,=0A= the driver restricts ArraySize to 64, which caps the total surface pool siz= e -=0A= so increasing extra_hw_frames isn=92t always viable.=0A= =0A= In such scenarios, a short retry loop becomes necessary to maintain pipelin= e=0A= flow and avoid premature allocation failures. I instrumented the retry logi= c=0A= in one of my test cases - 4K to 1080p AVC transcode using D3D11VA decode=0A= and Media Foundation encode - and observed the following behavior:=0A= =0A= - Most frames succeed with 1-2 retries=0A= - Roughly 1 in 100 frames may require up to 10 retries=0A= =0A= Based on this, I=92ve bounded the retry count to 50. This allows enough hea= droom=0A= without risking an infinite loop. Please let me know if this works.=0A= =0A= Thanks again,=0A= Dash.=0A= =0A= =0A= 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= Changelog | 1 +=0A= configure | 1 +=0A= libavfilter/Makefile | 1 +=0A= libavfilter/allfilters.c | 1 +=0A= libavfilter/vf_scale_d3d11.c | 464 ++++++++++++++++++++++++++++++++++=0A= libavutil/hwcontext_d3d11va.c | 45 +++-=0A= 6 files changed, 502 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/configure b/configure=0A= index a1f483f02c..10c7c9e7b5 100755=0A= --- a/configure=0A= +++ b/configure=0A= @@ -3359,6 +3359,7 @@ overlay_cuda_filter_deps_any=3D"cuda_nvcc cuda_llvm"= =0A= sharpen_npp_filter_deps=3D"ffnvcodec libnpp"=0A= =0A= ddagrab_filter_deps=3D"d3d11va IDXGIOutput1 DXGI_OUTDUPL_FRAME_INFO"=0A= +scale_d3d11_filter_deps=3D"d3d11va"=0A= =0A= amf_deps_any=3D"libdl LoadLibrary"=0A= nvenc_deps=3D"ffnvcodec"=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..6a3b193a63 100644=0A= --- a/libavutil/hwcontext_d3d11va.c=0A= +++ b/libavutil/hwcontext_d3d11va.c=0A= @@ -42,6 +42,8 @@=0A= #include "thread.h"=0A= #include "compat/w32dlfcn.h"=0A= =0A= +#define MAX_ARRAY_SIZE 64 // Driver specification limits ArraySize to 64 f= or decoder-bound resources=0A= +=0A= typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFac= tory);=0A= =0A= static AVOnce functions_loaded =3D AV_ONCE_INIT;=0A= @@ -82,6 +84,8 @@ typedef struct D3D11VAFramesContext {=0A= =0A= int nb_surfaces;=0A= int nb_surfaces_used;=0A= + int retries;=0A= + int max_retries;=0A= =0A= DXGI_FORMAT format;=0A= =0A= @@ -258,7 +262,9 @@ static AVBufferRef *d3d11va_pool_alloc(void *opaque, si= ze_t size)=0A= ID3D11Texture2D_GetDesc(hwctx->texture, &texDesc);=0A= =0A= if (s->nb_surfaces_used >=3D texDesc.ArraySize) {=0A= - av_log(ctx, AV_LOG_ERROR, "Static surface pool size exceeded.\n");= =0A= + if (s->retries >=3D s->max_retries) {=0A= + av_log(ctx, AV_LOG_ERROR, "Static surface pool size exceeded.\= n");=0A= + }=0A= return NULL;=0A= }=0A= =0A= @@ -288,6 +294,8 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)= =0A= return AVERROR(EINVAL);=0A= }=0A= =0A= + ctx->initial_pool_size =3D FFMIN(ctx->initial_pool_size, MAX_ARRAY_SIZ= E);=0A= +=0A= texDesc =3D (D3D11_TEXTURE2D_DESC){=0A= .Width =3D ctx->width,=0A= .Height =3D ctx->height,=0A= @@ -339,20 +347,35 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx= )=0A= static int d3d11va_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)=0A= {=0A= AVD3D11FrameDescriptor *desc;=0A= + D3D11VAFramesContext *s =3D ctx->hwctx;=0A= + s->retries =3D 0;=0A= + s->max_retries =3D 50;=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= + while (s->retries < s->max_retries) {=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(1000);=0A= + }=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_PN0P287MB1494A6A5E06359341A401342E152APN0P287MB1494INDP_ Content-Type: application/octet-stream; name="v5-0001-avfilter-add-scale_d3d11-filter.patch" Content-Description: v5-0001-avfilter-add-scale_d3d11-filter.patch Content-Disposition: attachment; filename="v5-0001-avfilter-add-scale_d3d11-filter.patch"; size=22644; creation-date="Sun, 20 Jul 2025 08:57:45 GMT"; modification-date="Sun, 20 Jul 2025 08:57:45 GMT" Content-Transfer-Encoding: base64 RnJvbSAxODNiMDIxYmY5NWNkZjY4N2U1MTczZTkxZDlhYmI2NmMwOTc4ZWRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXNoIFNhbnRvc2ggPGRhc2guc2F0aHlhbmFyYXlhbmFuQG11 bHRpY29yZXdhcmVpbmMuY29tPgpEYXRlOiBXZWQsIDExIEp1biAyMDI1IDA1OjI2OjE5IC0wNzAw ClN1YmplY3Q6IFtQQVRDSCB2NSAxLzJdIGF2ZmlsdGVyOiBhZGQgc2NhbGVfZDNkMTEgZmlsdGVy CgpUaGlzIGNvbW1pdCBpbnRyb2R1Y2VzIGEgbmV3IGhhcmR3YXJlLWFjY2VsZXJhdGVkIHZpZGVv IGZpbHRlciwgc2NhbGVfZDNkMTEsCndoaWNoIHBlcmZvcm1zIHNjYWxpbmcgYW5kIGZvcm1hdCBj b252ZXJzaW9uIHVzaW5nIERpcmVjdDNEIDExLiBUaGUgZmlsdGVyIGVuYWJsZXMKZWZmaWNpZW50 IEdQVS1iYXNlZCBzY2FsaW5nIGFuZCBwaXhlbCBmb3JtYXQgY29udmVyc2lvbiAocDAxMCB0byBu djEyKSwgcmVkdWNpbmcKQ1BVIG92ZXJoZWFkIGFuZCBsYXRlbmN5IGluIHZpZGVvIHBpcGVsaW5l cy4KLS0tCiBDaGFuZ2Vsb2cgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBjb25maWd1cmUg ICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBsaWJhdmZpbHRlci9NYWtlZmlsZSAgICAgICAg ICB8ICAgMSArCiBsaWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMgICAgICB8ICAgMSArCiBsaWJhdmZp bHRlci92Zl9zY2FsZV9kM2QxMS5jICB8IDQ2NCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBsaWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuYyB8ICA0NSArKystCiA2IGZpbGVz IGNoYW5nZWQsIDUwMiBpbnNlcnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBsaWJhdmZpbHRlci92Zl9zY2FsZV9kM2QxMS5jCgpkaWZmIC0tZ2l0IGEvQ2hhbmdl bG9nIGIvQ2hhbmdlbG9nCmluZGV4IDQyMTc0NDk0MzguLjU2MTIyZWY1NTUgMTAwNjQ0Ci0tLSBh L0NoYW5nZWxvZworKysgYi9DaGFuZ2Vsb2cKQEAgLTE4LDYgKzE4LDcgQEAgdmVyc2lvbiA8bmV4 dD46CiAtIEFQViBlbmNvZGluZyBzdXBwb3J0IHRocm91Z2ggYSBsaWJvcGVuYXB2IHdyYXBwZXIK IC0gVlZDIGRlY29kZXIgc3VwcG9ydHMgYWxsIGNvbnRlbnQgb2YgU0NDIChTY3JlZW4gQ29udGVu dCBDb2RpbmcpOgogICBJQkMgKEludGVyIEJsb2NrIENvcHkpLCBQYWxldHRlIE1vZGUgYW5kIEFD VCAoQWRhcHRpdmUgQ29sb3IgVHJhbnNmb3JtCistIEFkZCB2Zl9zY2FsZV9kM2QxMSBmaWx0ZXIK IAogCiB2ZXJzaW9uIDcuMToKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRl eCBhMWY0ODNmMDJjLi4xMGM3YzllN2I1IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29u ZmlndXJlCkBAIC0zMzU5LDYgKzMzNTksNyBAQCBvdmVybGF5X2N1ZGFfZmlsdGVyX2RlcHNfYW55 PSJjdWRhX252Y2MgY3VkYV9sbHZtIgogc2hhcnBlbl9ucHBfZmlsdGVyX2RlcHM9ImZmbnZjb2Rl YyBsaWJucHAiCiAKIGRkYWdyYWJfZmlsdGVyX2RlcHM9ImQzZDExdmEgSURYR0lPdXRwdXQxIERY R0lfT1VURFVQTF9GUkFNRV9JTkZPIgorc2NhbGVfZDNkMTFfZmlsdGVyX2RlcHM9ImQzZDExdmEi CiAKIGFtZl9kZXBzX2FueT0ibGliZGwgTG9hZExpYnJhcnkiCiBudmVuY19kZXBzPSJmZm52Y29k ZWMiCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9NYWtlZmlsZSBiL2xpYmF2ZmlsdGVyL01ha2Vm aWxlCmluZGV4IDk3ZjhmMTcyNzIuLjk1NjEyZDc1M2QgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVy L01ha2VmaWxlCisrKyBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCkBAIC00NjIsNiArNDYyLDcgQEAg T0JKUy0kKENPTkZJR19ST0JFUlRTX09QRU5DTF9GSUxURVIpICAgICAgICAgKz0gdmZfY29udm9s dXRpb25fb3BlbmNsLm8gb3BlbmNsLm8KIE9CSlMtJChDT05GSUdfUk9UQVRFX0ZJTFRFUikgICAg ICAgICAgICAgICAgICs9IHZmX3JvdGF0ZS5vCiBPQkpTLSQoQ09ORklHX1NBQl9GSUxURVIpICAg ICAgICAgICAgICAgICAgICArPSB2Zl9zYWIubwogT0JKUy0kKENPTkZJR19TQ0FMRV9GSUxURVIp ICAgICAgICAgICAgICAgICAgKz0gdmZfc2NhbGUubyBzY2FsZV9ldmFsLm8gZnJhbWVzeW5jLm8K K09CSlMtJChDT05GSUdfU0NBTEVfRDNEMTFfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3NjYWxl X2QzZDExLm8gc2NhbGVfZXZhbC5vCiBPQkpTLSQoQ09ORklHX1NDQUxFX0NVREFfRklMVEVSKSAg ICAgICAgICAgICArPSB2Zl9zY2FsZV9jdWRhLm8gc2NhbGVfZXZhbC5vIFwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmX3NjYWxlX2N1ZGEucHR4Lm8g Y3VkYS9sb2FkX2hlbHBlci5vCiBPQkpTLSQoQ09ORklHX1NDQUxFX05QUF9GSUxURVIpICAgICAg ICAgICAgICArPSB2Zl9zY2FsZV9ucHAubyBzY2FsZV9ldmFsLm8KZGlmZiAtLWdpdCBhL2xpYmF2 ZmlsdGVyL2FsbGZpbHRlcnMuYyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwppbmRleCAzYmMw NDViMjhmLi5lYzVlMDk0OTRhIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMK KysrIGIvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jCkBAIC00MzYsNiArNDM2LDcgQEAgZXh0ZXJu IGNvbnN0IEZGRmlsdGVyIGZmX3ZmX3NjYWxlOwogZXh0ZXJuIGNvbnN0IEZGRmlsdGVyIGZmX3Zm X3ZwcF9hbWY7CiBleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc3JfYW1mOwogZXh0ZXJuIGNv bnN0IEZGRmlsdGVyIGZmX3ZmX3NjYWxlX2N1ZGE7CitleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZf dmZfc2NhbGVfZDNkMTE7CiBleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVfbnBwOwog ZXh0ZXJuIGNvbnN0IEZGRmlsdGVyIGZmX3ZmX3NjYWxlX3FzdjsKIGV4dGVybiBjb25zdCBGRkZp bHRlciBmZl92Zl9zY2FsZV92YWFwaTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NjYWxl X2QzZDExLmMgYi9saWJhdmZpbHRlci92Zl9zY2FsZV9kM2QxMS5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAuLjBiNzQ3NmRkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJh dmZpbHRlci92Zl9zY2FsZV9kM2QxMS5jCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJp Z2h0IChDKSAyMDI1IE11bHRpY29yZXdXYXJlLCBJbmMuCisgKgorICogQXV0aG9yczogRGFzaCBT YW50b3NoIDxkYXNoLnNhdGhhbmF0YXlhbmFuQG11bHRpY29yZXdhcmVpbmMuY29tPgorICogICAg ICAgICAgU2FjaGluIDxzYWNoaW4ucHJha2FzaEBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KKyAqCisg KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM aWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9v cHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImNvbXBhdC93 MzJkbGZjbi5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUg ImxpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5oIgorCisjaW5jbHVkZSAiZmlsdGVycy5oIgor I2luY2x1ZGUgInNjYWxlX2V2YWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0 cnVjdCBTY2FsZUQzRDExQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3NDdHg7Cisg ICAgY2hhciAqd19leHByOworICAgIGNoYXIgKmhfZXhwcjsKKyAgICBlbnVtIEFWUGl4ZWxGb3Jt YXQgZm9ybWF0OworCisgICAgLy8vPCBEM0QxMSBvYmplY3RzCisgICAgSUQzRDExRGV2aWNlICpk ZXZpY2U7CisgICAgSUQzRDExRGV2aWNlQ29udGV4dCAqY29udGV4dDsKKyAgICBJRDNEMTFWaWRl b0RldmljZSAqdmlkZW9EZXZpY2U7CisgICAgSUQzRDExVmlkZW9Qcm9jZXNzb3IgKnByb2Nlc3Nv cjsKKyAgICBJRDNEMTFWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3IgKmVudW1lcmF0b3I7CisgICAg SUQzRDExVmlkZW9Qcm9jZXNzb3JPdXRwdXRWaWV3ICpvdXRwdXRWaWV3OworICAgIElEM0QxMVZp ZGVvUHJvY2Vzc29ySW5wdXRWaWV3ICppbnB1dFZpZXc7CisKKyAgICAvLy88IEJ1ZmZlciByZWZl cmVuY2VzCisgICAgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9jdHg7CisgICAgQVZCdWZmZXJSZWYg Kmh3X2ZyYW1lc19jdHhfb3V0OworCisgICAgLy8vPCBEaW1lbnNpb25zIGFuZCBmb3JtYXRzCisg ICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0Owor ICAgIERYR0lfRk9STUFUIGlucHV0X2Zvcm1hdDsKKyAgICBEWEdJX0ZPUk1BVCBvdXRwdXRfZm9y bWF0OworfSBTY2FsZUQzRDExQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHNjYWxlX2Qz ZDExX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpIHsKKyAgICAvLy88IGFsbCByZWFsIHdvcmsg aXMgZG9uZSBpbiBjb25maWdfcHJvcHMgYW5kIGZpbHRlcl9mcmFtZQorICAgIHJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2QzZDExX3Jlc291cmNlcyhTY2FsZUQzRDExQ29udGV4 dCAqcykgeworICAgIGlmIChzLT5vdXRwdXRWaWV3KSB7CisgICAgICAgIHMtPm91dHB1dFZpZXct PmxwVnRibC0+UmVsZWFzZShzLT5vdXRwdXRWaWV3KTsKKyAgICAgICAgcy0+b3V0cHV0VmlldyA9 IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPnByb2Nlc3NvcikgeworICAgICAgICBzLT5wcm9j ZXNzb3ItPmxwVnRibC0+UmVsZWFzZShzLT5wcm9jZXNzb3IpOworICAgICAgICBzLT5wcm9jZXNz b3IgPSBOVUxMOworICAgIH0KKworICAgIGlmIChzLT5lbnVtZXJhdG9yKSB7CisgICAgICAgIHMt PmVudW1lcmF0b3ItPmxwVnRibC0+UmVsZWFzZShzLT5lbnVtZXJhdG9yKTsKKyAgICAgICAgcy0+ ZW51bWVyYXRvciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPnZpZGVvRGV2aWNlKSB7Cisg ICAgICAgIHMtPnZpZGVvRGV2aWNlLT5scFZ0YmwtPlJlbGVhc2Uocy0+dmlkZW9EZXZpY2UpOwor ICAgICAgICBzLT52aWRlb0RldmljZSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNj YWxlX2QzZDExX2NvbmZpZ3VyZV9wcm9jZXNzb3IoU2NhbGVEM0QxMUNvbnRleHQgKnMsIEFWRmls dGVyQ29udGV4dCAqY3R4KSB7CisgICAgSFJFU1VMVCBocjsKKworICAgIHN3aXRjaCAocy0+Zm9y bWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICAgICAgcy0+b3V0 cHV0X2Zvcm1hdCA9IERYR0lfRk9STUFUX05WMTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgY2FzZSBBVl9QSVhfRk1UX1AwMTA6CisgICAgICAgICAgICBzLT5vdXRwdXRfZm9ybWF0ID0g RFhHSV9GT1JNQVRfUDAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0Ogor ICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgZm9y bWF0IHNwZWNpZmllZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwor ICAgIH0KKworICAgIC8vLzwgR2V0IEQzRDExIGRldmljZSBhbmQgY29udGV4dCBmcm9tIGhhcmR3 YXJlIGRldmljZSBjb250ZXh0CisgICAgQVZIV0RldmljZUNvbnRleHQgKmh3Y3R4ID0gKEFWSFdE ZXZpY2VDb250ZXh0ICopcy0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKyAgICBBVkQzRDExVkFEZXZp Y2VDb250ZXh0ICpkM2QxMV9od2N0eCA9IChBVkQzRDExVkFEZXZpY2VDb250ZXh0ICopaHdjdHgt Pmh3Y3R4OworICAgIHMtPmRldmljZSA9IGQzZDExX2h3Y3R4LT5kZXZpY2U7CisgICAgcy0+Y29u dGV4dCA9IGQzZDExX2h3Y3R4LT5kZXZpY2VfY29udGV4dDsKKworICAgIGF2X2xvZyhjdHgsIEFW X0xPR19WRVJCT1NFLCAiQ29uZmlndXJpbmcgRDNEMTEgdmlkZW8gcHJvY2Vzc29yOiAlZHglZCAt PiAlZHglZFxuIiwKKyAgICAgICAgICAgcy0+aW5wdXRXaWR0aCwgcy0+aW5wdXRIZWlnaHQsIHMt PndpZHRoLCBzLT5oZWlnaHQpOworCisgICAgLy8vPCBEZWZpbmUgdGhlIHZpZGVvIHByb2Nlc3Nv ciBjb250ZW50IGRlc2NyaXB0aW9uCisgICAgRDNEMTFfVklERU9fUFJPQ0VTU09SX0NPTlRFTlRf REVTQyBjb250ZW50RGVzYyA9IHsKKyAgICAgICAgLklucHV0RnJhbWVGb3JtYXQgPSBEM0QxMV9W SURFT19GUkFNRV9GT1JNQVRfUFJPR1JFU1NJVkUsCisgICAgICAgIC5JbnB1dFdpZHRoID0gcy0+ aW5wdXRXaWR0aCwKKyAgICAgICAgLklucHV0SGVpZ2h0ID0gcy0+aW5wdXRIZWlnaHQsCisgICAg ICAgIC5PdXRwdXRXaWR0aCA9IHMtPndpZHRoLAorICAgICAgICAuT3V0cHV0SGVpZ2h0ID0gcy0+ aGVpZ2h0LAorICAgICAgICAuVXNhZ2UgPSBEM0QxMV9WSURFT19VU0FHRV9QTEFZQkFDS19OT1JN QUwsCisgICAgfTsKKworICAgIC8vLzwgUXVlcnkgdmlkZW8gZGV2aWNlIGludGVyZmFjZQorICAg IGhyID0gcy0+ZGV2aWNlLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHMtPmRldmljZSwgJklJRF9J RDNEMTFWaWRlb0RldmljZSwgKHZvaWQgKiopJnMtPnZpZGVvRGV2aWNlKTsKKyAgICBpZiAoRkFJ TEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8g Z2V0IEQzRDExIHZpZGVvIGRldmljZSBpbnRlcmZhY2U6IEhSRVNVTFQgMHglbFhcbiIsIGhyKTsK KyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8vPCBDcmVh dGUgdmlkZW8gcHJvY2Vzc29yIGVudW1lcmF0b3IKKyAgICBociA9IHMtPnZpZGVvRGV2aWNlLT5s cFZ0YmwtPkNyZWF0ZVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcihzLT52aWRlb0RldmljZSwgJmNv bnRlbnREZXNjLCAmcy0+ZW51bWVyYXRvcik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAg ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBwcm9j ZXNzb3IgZW51bWVyYXRvcjogSFJFU1VMVCAweCVsWFxuIiwgaHIpOworICAgICAgICByZXR1cm4g QVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICAvLy88IENyZWF0ZSB0aGUgdmlkZW8gcHJv Y2Vzc29yCisgICAgaHIgPSBzLT52aWRlb0RldmljZS0+bHBWdGJsLT5DcmVhdGVWaWRlb1Byb2Nl c3NvcihzLT52aWRlb0RldmljZSwgcy0+ZW51bWVyYXRvciwgMCwgJnMtPnByb2Nlc3Nvcik7Cisg ICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAi RmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBwcm9jZXNzb3I6IEhSRVNVTFQgMHglbFhcbiIsIGhyKTsK KyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgYXZfbG9nKGN0 eCwgQVZfTE9HX1ZFUkJPU0UsICJEM0QxMSB2aWRlbyBwcm9jZXNzb3Igc3VjY2Vzc2Z1bGx5IGNv bmZpZ3VyZWRcbiIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYWxlX2QzZDEx X2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAg QVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTY2FsZUQzRDExQ29udGV4 dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1 dHNbMF07CisgICAgSUQzRDExVmlkZW9Qcm9jZXNzb3JJbnB1dFZpZXcgKmlucHV0VmlldyA9IE5V TEw7CisgICAgSUQzRDExVmlkZW9Db250ZXh0ICp2aWRlb0NvbnRleHQgPSBOVUxMOworICAgIEFW RnJhbWUgKm91dCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgSFJFU1VMVCBocjsKKwor ICAgIC8vLzwgVmFsaWRhdGUgaW5wdXQgZnJhbWUKKyAgICBpZiAoIWluKSB7CisgICAgICAgIGF2 X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk51bGwgaW5wdXQgZnJhbWVcbiIpOworICAgICAgICBy ZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghaW4tPmh3X2ZyYW1lc19j dHgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gaGFyZHdhcmUgZnJh bWVzIGNvbnRleHQgaW4gaW5wdXQgZnJhbWVcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZp bik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8vPCBW ZXJpZnkgaGFyZHdhcmUgZGV2aWNlIGNvbnRleHRzCisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZy YW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilpbi0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsK KworICAgIGlmICghcy0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9M T0dfRVJST1IsICJGaWx0ZXIgaGFyZHdhcmUgZGV2aWNlIGNvbnRleHQgaXMgdW5pbml0aWFsaXpl ZFxuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJS T1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqaW5wdXRfZGV2aWNl X2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCAqKWZyYW1lc19jdHgtPmRldmljZV9yZWYtPmRhdGE7 CisgICAgQVZIV0RldmljZUNvbnRleHQgKmZpbHRlcl9kZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VD b250ZXh0ICopcy0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKworICAgIGlmIChpbnB1dF9kZXZpY2Vf Y3R4LT50eXBlICE9IGZpbHRlcl9kZXZpY2VfY3R4LT50eXBlKSB7CisgICAgICAgIGF2X2xvZyhj dHgsIEFWX0xPR19FUlJPUiwgIk1pc21hdGNoIGJldHdlZW4gaW5wdXQgYW5kIGZpbHRlciBoYXJk d2FyZSBkZXZpY2UgdHlwZXNcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAg ICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8vPCBBbGxvY2F0ZSBv dXRwdXQgZnJhbWUKKyAgICBvdXQgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghb3V0KSB7 CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBv dXRwdXQgZnJhbWVcbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJl dHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0ID0gYXZfaHdmcmFtZV9nZXRf YnVmZmVyKHMtPmh3X2ZyYW1lc19jdHhfb3V0LCBvdXQsIDApOworICAgIGlmIChyZXQgPCAwKSB7 CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgb3V0cHV0 IGZyYW1lIGZyb20gcG9vbFxuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAg ICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAg ICAvLy88IENvbmZpZ3VyZSB0aGUgRDNEMTEgdmlkZW8gcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5 IGNvbmZpZ3VyZWQKKyAgICBpZiAoIXMtPnByb2Nlc3NvcikgeworICAgICAgICAvLy88IEdldCBp bmZvIGZyb20gaW5wdXQgdGV4dHVyZQorICAgICAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXh0 dXJlRGVzYzsKKyAgICAgICAgSUQzRDExVGV4dHVyZTJEICppbnB1dF90ZXh0dXJlID0gKElEM0Qx MVRleHR1cmUyRCAqKWluLT5kYXRhWzBdOworICAgICAgICBpbnB1dF90ZXh0dXJlLT5scFZ0Ymwt PkdldERlc2MoaW5wdXRfdGV4dHVyZSwgJnRleHR1cmVEZXNjKTsKKworICAgICAgICBzLT5pbnB1 dFdpZHRoID0gdGV4dHVyZURlc2MuV2lkdGg7CisgICAgICAgIHMtPmlucHV0SGVpZ2h0ID0gdGV4 dHVyZURlc2MuSGVpZ2h0OworICAgICAgICBzLT5pbnB1dF9mb3JtYXQgPSB0ZXh0dXJlRGVzYy5G b3JtYXQ7CisKKyAgICAgICAgcmV0ID0gc2NhbGVfZDNkMTFfY29uZmlndXJlX3Byb2Nlc3Nvcihz LCBjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwg QVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwcm9jZXNzb3JcbiIpOworICAgICAg ICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0 KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy88 IEdldCBpbnB1dCB0ZXh0dXJlIGFuZCBwcmVwYXJlIGlucHV0IHZpZXcKKyAgICBJRDNEMTFUZXh0 dXJlMkQgKmQzZDExX3RleHR1cmUgPSAoSUQzRDExVGV4dHVyZTJEICopaW4tPmRhdGFbMF07Cisg ICAgaW50IHN1YklkeCA9IChpbnQpKGludHB0cl90KWluLT5kYXRhWzFdOworCisgICAgRDNEMTFf VklERU9fUFJPQ0VTU09SX0lOUFVUX1ZJRVdfREVTQyBpbnB1dFZpZXdEZXNjID0geworICAgICAg ICAuRm91ckNDID0gcy0+aW5wdXRfZm9ybWF0LAorICAgICAgICAuVmlld0RpbWVuc2lvbiA9IEQz RDExX1ZQSVZfRElNRU5TSU9OX1RFWFRVUkUyRCwKKyAgICAgICAgLlRleHR1cmUyRC5BcnJheVNs aWNlID0gc3ViSWR4CisgICAgfTsKKworICAgIGhyID0gcy0+dmlkZW9EZXZpY2UtPmxwVnRibC0+ Q3JlYXRlVmlkZW9Qcm9jZXNzb3JJbnB1dFZpZXcoCisgICAgICAgIHMtPnZpZGVvRGV2aWNlLCAo SUQzRDExUmVzb3VyY2UgKilkM2QxMV90ZXh0dXJlLCBzLT5lbnVtZXJhdG9yLCAmaW5wdXRWaWV3 RGVzYywgJmlucHV0Vmlldyk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9n KGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCB2aWV3OiBIUkVTVUxU IDB4JWxYXG4iLCBocik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZf ZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAg fQorCisgICAgLy8vPCBDcmVhdGUgb3V0cHV0IHZpZXcgZm9yIGN1cnJlbnQgdGV4dHVyZQorICAg IElEM0QxMVRleHR1cmUyRCAqb3V0cHV0X3RleHR1cmUgPSAoSUQzRDExVGV4dHVyZTJEICopb3V0 LT5kYXRhWzBdOworICAgIEQzRDExX1ZJREVPX1BST0NFU1NPUl9PVVRQVVRfVklFV19ERVNDIG91 dHB1dFZpZXdEZXNjID0geworICAgICAgICAuVmlld0RpbWVuc2lvbiA9IEQzRDExX1ZQT1ZfRElN RU5TSU9OX1RFWFRVUkUyRCwKKyAgICAgICAgLlRleHR1cmUyRCA9IHsgLk1pcFNsaWNlID0gMCB9 LAorICAgIH07CisKKyAgICBociA9IHMtPnZpZGVvRGV2aWNlLT5scFZ0YmwtPkNyZWF0ZVZpZGVv UHJvY2Vzc29yT3V0cHV0VmlldygKKyAgICAgICAgcy0+dmlkZW9EZXZpY2UsIChJRDNEMTFSZXNv dXJjZSAqKW91dHB1dF90ZXh0dXJlLCBzLT5lbnVtZXJhdG9yLCAmb3V0cHV0Vmlld0Rlc2MsICZz LT5vdXRwdXRWaWV3KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4 LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCB2aWV3OiBIUkVTVUxUIDB4 JWxYXG4iLCBocik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJh bWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQor CisgICAgLy8vPCBTZXQgdXAgcHJvY2Vzc2luZyBzdHJlYW0KKyAgICBEM0QxMV9WSURFT19QUk9D RVNTT1JfU1RSRUFNIHN0cmVhbSA9IHsKKyAgICAgICAgLkVuYWJsZSA9IFRSVUUsCisgICAgICAg IC5wSW5wdXRTdXJmYWNlID0gaW5wdXRWaWV3LAorICAgICAgICAuT3V0cHV0SW5kZXggPSAwCisg ICAgfTsKKworICAgIC8vLzwgR2V0IHZpZGVvIGNvbnRleHQKKyAgICBociA9IHMtPmNvbnRleHQt PmxwVnRibC0+UXVlcnlJbnRlcmZhY2Uocy0+Y29udGV4dCwgJklJRF9JRDNEMTFWaWRlb0NvbnRl eHQsICh2b2lkICoqKSZ2aWRlb0NvbnRleHQpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAg ICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgdmlkZW8gY29udGV4 dDogSFJFU1VMVCAweCVsWFxuIiwgaHIpOworICAgICAgICBpbnB1dFZpZXctPmxwVnRibC0+UmVs ZWFzZShpbnB1dFZpZXcpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIGF2 X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAg IH0KKworICAgIC8vLzwgUHJvY2VzcyB0aGUgZnJhbWUKKyAgICBociA9IHZpZGVvQ29udGV4dC0+ bHBWdGJsLT5WaWRlb1Byb2Nlc3NvckJsdCh2aWRlb0NvbnRleHQsIHMtPnByb2Nlc3Nvciwgcy0+ b3V0cHV0VmlldywgMCwgMSwgJnN0cmVhbSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAg ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVmlkZW9Qcm9jZXNzb3JCbHQgZmFpbGVkOiBI UkVTVUxUIDB4JWxYXG4iLCBocik7CisgICAgICAgIHZpZGVvQ29udGV4dC0+bHBWdGJsLT5SZWxl YXNlKHZpZGVvQ29udGV4dCk7CisgICAgICAgIGlucHV0Vmlldy0+bHBWdGJsLT5SZWxlYXNlKGlu cHV0Vmlldyk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZfZnJhbWVf ZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisg ICAgLy8vPCBTZXQgdXAgb3V0cHV0IGZyYW1lCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9w cyhvdXQsIGluKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9M T0dfRVJST1IsICJGYWlsZWQgdG8gY29weSBmcmFtZSBwcm9wZXJ0aWVzXG4iKTsKKyAgICAgICAg dmlkZW9Db250ZXh0LT5scFZ0YmwtPlJlbGVhc2UodmlkZW9Db250ZXh0KTsKKyAgICAgICAgaW5w dXRWaWV3LT5scFZ0YmwtPlJlbGVhc2UoaW5wdXRWaWV3KTsKKyAgICAgICAgYXZfZnJhbWVfZnJl ZSgmaW4pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gcmV0 OworICAgIH0KKworICAgIG91dC0+ZGF0YVswXSA9ICh1aW50OF90ICopb3V0cHV0X3RleHR1cmU7 CisgICAgb3V0LT5kYXRhWzFdID0gKHVpbnQ4X3QgKikoaW50cHRyX3QpMDsKKyAgICBvdXQtPndp ZHRoID0gcy0+d2lkdGg7CisgICAgb3V0LT5oZWlnaHQgPSBzLT5oZWlnaHQ7CisgICAgb3V0LT5m b3JtYXQgPSBBVl9QSVhfRk1UX0QzRDExOworCisgICAgLy8vPCBDbGVhbiB1cCByZXNvdXJjZXMK KyAgICBpbnB1dFZpZXctPmxwVnRibC0+UmVsZWFzZShpbnB1dFZpZXcpOworICAgIHZpZGVvQ29u dGV4dC0+bHBWdGJsLT5SZWxlYXNlKHZpZGVvQ29udGV4dCk7CisgICAgaWYgKHMtPm91dHB1dFZp ZXcpIHsKKyAgICAgICAgcy0+b3V0cHV0Vmlldy0+bHBWdGJsLT5SZWxlYXNlKHMtPm91dHB1dFZp ZXcpOworICAgICAgICBzLT5vdXRwdXRWaWV3ID0gTlVMTDsKKyAgICB9CisgICAgYXZfZnJhbWVf ZnJlZSgmaW4pOworCisgICAgLy8vPCBGb3J3YXJkIHRoZSBmcmFtZQorICAgIHJldHVybiBmZl9m aWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGludCBzY2FsZV9kM2QxMV9j b25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4 dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFNjYWxlRDNEMTFDb250ZXh0ICpzID0gY3R4LT5w cml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgRmls dGVyTGluayAqaW5sID0gZmZfZmlsdGVyX2xpbmsoaW5saW5rKTsKKyAgICBGaWx0ZXJMaW5rICpv dXRsID0gZmZfZmlsdGVyX2xpbmsob3V0bGluayk7CisgICAgaW50IHJldDsKKworICAgIC8vLzwg Q2xlYW4gdXAgYW55IHByZXZpb3VzIHJlc291cmNlcworICAgIHJlbGVhc2VfZDNkMTFfcmVzb3Vy Y2VzKHMpOworCisgICAgLy8vPCBFdmFsdWF0ZSBvdXRwdXQgZGltZW5zaW9ucworICAgIHJldCA9 IGZmX3NjYWxlX2V2YWxfZGltZW5zaW9ucyhzLCBzLT53X2V4cHIsIHMtPmhfZXhwciwgaW5saW5r LCBvdXRsaW5rLCAmcy0+d2lkdGgsICZzLT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKSB7Cisg ICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBldmFsdWF0ZSBkaW1l bnNpb25zXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBvdXRsaW5rLT53 ID0gcy0+d2lkdGg7CisgICAgb3V0bGluay0+aCA9IHMtPmhlaWdodDsKKworICAgIC8vLzwgVmFs aWRhdGUgaW5wdXQgaHdfZnJhbWVzX2N0eAorICAgIGlmICghaW5sLT5od19mcmFtZXNfY3R4KSB7 CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGh3X2ZyYW1lc19jdHggYXZh aWxhYmxlIG9uIGlucHV0IGxpbmtcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwp OworICAgIH0KKworICAgIC8vLzwgUHJvcGFnYXRlIGh3X2ZyYW1lc19jdHggdG8gb3V0cHV0Cisg ICAgb3V0bC0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaW5sLT5od19mcmFtZXNfY3R4 KTsKKyAgICBpZiAoIW91dGwtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwg QVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHByb3BhZ2F0ZSBod19mcmFtZXNfY3R4IHRvIG91dHB1 dFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLy8v PCBJbml0aWFsaXplIGZpbHRlcidzIGhhcmR3YXJlIGRldmljZSBjb250ZXh0CisgICAgaWYgKCFz LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICppbl9mcmFtZXNf Y3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0ICopaW5sLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAg ICAgICBzLT5od19kZXZpY2VfY3R4ID0gYXZfYnVmZmVyX3JlZihpbl9mcmFtZXNfY3R4LT5kZXZp Y2VfcmVmKTsKKyAgICAgICAgaWYgKCFzLT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgICAgICBh dl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaWx0ZXIgaGFy ZHdhcmUgZGV2aWNlIGNvbnRleHRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5P TUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLzwgR2V0IEQzRDExIGRldmljZSBhbmQg Y29udGV4dCAoYnV0IGRvbid0IGluaXRpYWxpemUgcHJvY2Vzc29yIHlldCAtIGRvbmUgaW4gZmls dGVyX2ZyYW1lKQorICAgIEFWSFdEZXZpY2VDb250ZXh0ICpod2N0eCA9IChBVkhXRGV2aWNlQ29u dGV4dCAqKXMtPmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4 dCAqZDNkMTFfaHdjdHggPSAoQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqKWh3Y3R4LT5od2N0eDsK KworICAgIHMtPmRldmljZSA9IGQzZDExX2h3Y3R4LT5kZXZpY2U7CisgICAgcy0+Y29udGV4dCA9 IGQzZDExX2h3Y3R4LT5kZXZpY2VfY29udGV4dDsKKworICAgIGlmICghcy0+ZGV2aWNlIHx8ICFz LT5jb250ZXh0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0 byBnZXQgdmFsaWQgRDNEMTEgZGV2aWNlIG9yIGNvbnRleHRcbiIpOworICAgICAgICByZXR1cm4g QVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vLzwgQ3JlYXRlIG5ldyBoYXJkd2FyZSBm cmFtZXMgY29udGV4dCBmb3Igb3V0cHV0CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmluX2ZyYW1l c19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilpbmwtPmh3X2ZyYW1lc19jdHgtPmRhdGE7Cisg ICAgcy0+aHdfZnJhbWVzX2N0eF9vdXQgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhzLT5od19kZXZp Y2VfY3R4KTsKKyAgICBpZiAoIXMtPmh3X2ZyYW1lc19jdHhfb3V0KQorICAgICAgICByZXR1cm4g QVZFUlJPUihFTk9NRU0pOworCisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAo QVZIV0ZyYW1lc0NvbnRleHQgKilzLT5od19mcmFtZXNfY3R4X291dC0+ZGF0YTsKKyAgICBmcmFt ZXNfY3R4LT5mb3JtYXQgPSBBVl9QSVhfRk1UX0QzRDExOworICAgIGZyYW1lc19jdHgtPnN3X2Zv cm1hdCA9IHMtPmZvcm1hdDsKKyAgICBmcmFtZXNfY3R4LT53aWR0aCA9IHMtPndpZHRoOworICAg IGZyYW1lc19jdHgtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBmcmFtZXNfY3R4LT5pbml0aWFs X3Bvb2xfc2l6ZSA9IDEwOworCisgICAgaWYgKGN0eC0+ZXh0cmFfaHdfZnJhbWVzID4gMCkKKyAg ICAgICAgZnJhbWVzX2N0eC0+aW5pdGlhbF9wb29sX3NpemUgKz0gY3R4LT5leHRyYV9od19mcmFt ZXM7CisKKyAgICBBVkQzRDExVkFGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBmcmFtZXNf Y3R4LT5od2N0eDsKKyAgICBmcmFtZXNfaHdjdHgtPk1pc2NGbGFncyA9IDA7CisgICAgZnJhbWVz X2h3Y3R4LT5CaW5kRmxhZ3MgPSBEM0QxMV9CSU5EX1JFTkRFUl9UQVJHRVQgfCBEM0QxMV9CSU5E X1ZJREVPX0VOQ09ERVI7CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX2N0eF9pbml0KHMtPmh3X2Zy YW1lc19jdHhfb3V0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9idWZmZXJfdW5y ZWYoJnMtPmh3X2ZyYW1lc19jdHhfb3V0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisK KyAgICBvdXRsLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihzLT5od19mcmFtZXNfY3R4 X291dCk7CisgICAgaWYgKCFvdXRsLT5od19mcmFtZXNfY3R4KQorICAgICAgICByZXR1cm4gQVZF UlJPUihFTk9NRU0pOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJEM0QxMSBz Y2FsZSBjb25maWc6ICVkeCVkIC0+ICVkeCVkXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlu bGluay0+aCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBhdl9jb2xkIHZvaWQgc2NhbGVfZDNkMTFfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4 KSB7CisgICAgU2NhbGVEM0QxMUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICAvLy88IFJl bGVhc2UgRDNEMTEgcmVzb3VyY2VzCisgICAgcmVsZWFzZV9kM2QxMV9yZXNvdXJjZXMocyk7CisK KyAgICAvLy88IEZyZWUgdGhlIGhhcmR3YXJlIGRldmljZSBjb250ZXh0IHJlZmVyZW5jZQorICAg IGF2X2J1ZmZlcl91bnJlZigmcy0+aHdfZnJhbWVzX2N0eF9vdXQpOworICAgIGF2X2J1ZmZlcl91 bnJlZigmcy0+aHdfZGV2aWNlX2N0eCk7CisKKyAgICAvLy88IEZyZWUgb3B0aW9uIHN0cmluZ3MK KyAgICBhdl9mcmVlcCgmcy0+d19leHByKTsKKyAgICBhdl9mcmVlcCgmcy0+aF9leHByKTsKK30K Kworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNjYWxlX2QzZDExX2lucHV0c1tdID0geworICAg IHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAg ICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IHNjYWxl X2QzZDExX2ZpbHRlcl9mcmFtZSwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVy UGFkIHNjYWxlX2QzZDExX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAg ICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklE RU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBzY2FsZV9kM2QxMV9jb25maWdfcHJvcHMsCisg ICAgfSwKK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNjYWxlRDNEMTFDb250ZXh0 LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIHwgQVZfT1BU X0ZMQUdfVklERU9fUEFSQU0pCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzY2FsZV9kM2QxMV9v cHRpb25zW10gPSB7CisgICAgeyAid2lkdGgiLCAgIk91dHB1dCB2aWRlbyB3aWR0aCIsICBPRkZT RVQod19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpdyJ9LCAuZmxhZ3MgPSBG TEFHUyB9LAorICAgIHsgImhlaWdodCIsICJPdXRwdXQgdmlkZW8gaGVpZ2h0IiwgT0ZGU0VUKGhf ZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiaWgifSwgLmZsYWdzID0gRkxBR1Mg fSwKKyAgICB7ICJmb3JtYXQiLCAiT3V0cHV0IHZpZGVvIHBpeGVsIGZvcm1hdCIsIE9GRlNFVChm b3JtYXQpLCBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsIHsgLmk2NCA9IEFWX1BJWF9GTVRfTk9ORSB9 LCBJTlRfTUlOLCBJTlRfTUFYLCAuZmxhZ3M9RkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKwor QVZGSUxURVJfREVGSU5FX0NMQVNTKHNjYWxlX2QzZDExKTsKKworY29uc3QgRkZGaWx0ZXIgZmZf dmZfc2NhbGVfZDNkMTEgPSB7CisgICAgLnAubmFtZSAgICAgICAgICAgPSAic2NhbGVfZDNkMTEi LAorICAgIC5wLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNjYWxlIHZp ZGVvIHVzaW5nIERpcmVjdDNEMTEiKSwKKyAgICAucHJpdl9zaXplICAgICAgICA9IHNpemVvZihT Y2FsZUQzRDExQ29udGV4dCksCisgICAgLnAucHJpdl9jbGFzcyAgICAgPSAmc2NhbGVfZDNkMTFf Y2xhc3MsCisgICAgLmluaXQgICAgICAgICAgICAgPSBzY2FsZV9kM2QxMV9pbml0LAorICAgIC51 bmluaXQgICAgICAgICAgID0gc2NhbGVfZDNkMTFfdW5pbml0LAorICAgIEZJTFRFUl9JTlBVVFMo c2NhbGVfZDNkMTFfaW5wdXRzKSwKKyAgICBGSUxURVJfT1VUUFVUUyhzY2FsZV9kM2QxMV9vdXRw dXRzKSwKKyAgICBGSUxURVJfU0lOR0xFX1BJWEZNVChBVl9QSVhfRk1UX0QzRDExKSwKKyAgICAu cC5mbGFncyAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfSFdERVZJQ0UsCisgICAgLmZsYWdzX2lu dGVybmFsICAgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKXCBObyBuZXdsaW5l IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEu YyBiL2xpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5jCmluZGV4IDFhMDQ3Y2U1N2IuLjZhM2Ix OTNhNjMgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5jCisrKyBiL2xp YmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5jCkBAIC00Miw2ICs0Miw4IEBACiAjaW5jbHVkZSAi dGhyZWFkLmgiCiAjaW5jbHVkZSAiY29tcGF0L3czMmRsZmNuLmgiCiAKKyNkZWZpbmUgTUFYX0FS UkFZX1NJWkUgNjQgLy8gRHJpdmVyIHNwZWNpZmljYXRpb24gbGltaXRzIEFycmF5U2l6ZSB0byA2 NCBmb3IgZGVjb2Rlci1ib3VuZCByZXNvdXJjZXMKKwogdHlwZWRlZiBIUkVTVUxUKFdJTkFQSSAq UEZOX0NSRUFURV9EWEdJX0ZBQ1RPUlkpKFJFRklJRCByaWlkLCB2b2lkICoqcHBGYWN0b3J5KTsK IAogc3RhdGljIEFWT25jZSBmdW5jdGlvbnNfbG9hZGVkID0gQVZfT05DRV9JTklUOwpAQCAtODIs NiArODQsOCBAQCB0eXBlZGVmIHN0cnVjdCBEM0QxMVZBRnJhbWVzQ29udGV4dCB7CiAKICAgICBp bnQgbmJfc3VyZmFjZXM7CiAgICAgaW50IG5iX3N1cmZhY2VzX3VzZWQ7CisgICAgaW50IHJldHJp ZXM7CisgICAgaW50IG1heF9yZXRyaWVzOwogCiAgICAgRFhHSV9GT1JNQVQgZm9ybWF0OwogCkBA IC0yNTgsNyArMjYyLDkgQEAgc3RhdGljIEFWQnVmZmVyUmVmICpkM2QxMXZhX3Bvb2xfYWxsb2Mo dm9pZCAqb3BhcXVlLCBzaXplX3Qgc2l6ZSkKICAgICBJRDNEMTFUZXh0dXJlMkRfR2V0RGVzYyho d2N0eC0+dGV4dHVyZSwgJnRleERlc2MpOwogCiAgICAgaWYgKHMtPm5iX3N1cmZhY2VzX3VzZWQg Pj0gdGV4RGVzYy5BcnJheVNpemUpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9S LCAiU3RhdGljIHN1cmZhY2UgcG9vbCBzaXplIGV4Y2VlZGVkLlxuIik7CisgICAgICAgIGlmIChz LT5yZXRyaWVzID49IHMtPm1heF9yZXRyaWVzKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBB Vl9MT0dfRVJST1IsICJTdGF0aWMgc3VyZmFjZSBwb29sIHNpemUgZXhjZWVkZWQuXG4iKTsKKyAg ICAgICAgfQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTI4OCw2ICsyOTQsOCBA QCBzdGF0aWMgaW50IGQzZDExdmFfZnJhbWVzX2luaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkK ICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKKyAgICBjdHgtPmluaXRp YWxfcG9vbF9zaXplID0gRkZNSU4oY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSwgTUFYX0FSUkFZX1NJ WkUpOworCiAgICAgdGV4RGVzYyA9IChEM0QxMV9URVhUVVJFMkRfREVTQyl7CiAgICAgICAgIC5X aWR0aCAgICAgID0gY3R4LT53aWR0aCwKICAgICAgICAgLkhlaWdodCAgICAgPSBjdHgtPmhlaWdo dCwKQEAgLTMzOSwyMCArMzQ3LDM1IEBAIHN0YXRpYyBpbnQgZDNkMTF2YV9mcmFtZXNfaW5pdChB VkhXRnJhbWVzQ29udGV4dCAqY3R4KQogc3RhdGljIGludCBkM2QxMXZhX2dldF9idWZmZXIoQVZI V0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCiB7CiAgICAgQVZEM0QxMUZyYW1l RGVzY3JpcHRvciAqZGVzYzsKKyAgICBEM0QxMVZBRnJhbWVzQ29udGV4dCAgICAgICAqcyA9IGN0 eC0+aHdjdHg7CisgICAgcy0+cmV0cmllcyA9IDA7CisgICAgcy0+bWF4X3JldHJpZXMgPSA1MDsK IAotICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoY3R4LT5wb29sKTsKLSAg ICBpZiAoIWZyYW1lLT5idWZbMF0pCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAK LSAgICBkZXNjID0gKEFWRDNEMTFGcmFtZURlc2NyaXB0b3IgKilmcmFtZS0+YnVmWzBdLT5kYXRh OworICAgIC8qKgorICAgICAqIExvb3AgdW50aWwgYSBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUg ZnJvbSB0aGUgcG9vbC4KKyAgICAgKiBJbiBhIGZ1bGwgaGFyZHdhcmUgcGlwZWxpbmUsIGFsbCBi dWZmZXJzIG1heSBiZSB0ZW1wb3JhcmlseSBpbiB1c2UgYnkKKyAgICAgKiBvdGhlciBtb2R1bGVz IChlbmNvZGVyL2ZpbHRlci9kZWNvZGVyKS4gUmF0aGVyIHRoYW4gaW1tZWRpYXRlbHkgZmFpbGlu ZworICAgICAqIHdpdGggRU5PTUVNLCB3ZSB3YWl0IGZvciBhIGJ1ZmZlciB0byBiZSByZWxlYXNl ZCBiYWNrIHRvIHRoZSBwb29sLCB3aGljaAorICAgICAqIG1haW50YWlucyBwaXBlbGluZSBmbG93 IGFuZCBwcmV2ZW50cyB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uIGZhaWx1cmVzCisgICAgICogZHVy aW5nIG5vcm1hbCBvcGVyYXRpb24uCisgICAgICovCisgICAgd2hpbGUgKHMtPnJldHJpZXMgPCBz LT5tYXhfcmV0cmllcykgeworICAgICAgICBmcmFtZS0+YnVmWzBdID0gYXZfYnVmZmVyX3Bvb2xf Z2V0KGN0eC0+cG9vbCk7CisgICAgICAgIGlmIChmcmFtZS0+YnVmWzBdKSB7CisgICAgICAgICAg ICBkZXNjID0gKEFWRDNEMTFGcmFtZURlc2NyaXB0b3IgKilmcmFtZS0+YnVmWzBdLT5kYXRhOwor ICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0gPSAodWludDhfdCAqKWRlc2MtPnRleHR1cmU7Cisg ICAgICAgICAgICBmcmFtZS0+ZGF0YVsxXSA9ICh1aW50OF90ICopZGVzYy0+aW5kZXg7CisgICAg ICAgICAgICBmcmFtZS0+Zm9ybWF0ICA9IEFWX1BJWF9GTVRfRDNEMTE7CisgICAgICAgICAgICBm cmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7CisgICAgICAgICAgICBmcmFtZS0+aGVpZ2h0ICA9 IGN0eC0+aGVpZ2h0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotICAgIGZy YW1lLT5kYXRhWzBdID0gKHVpbnQ4X3QgKilkZXNjLT50ZXh0dXJlOwotICAgIGZyYW1lLT5kYXRh WzFdID0gKHVpbnQ4X3QgKilkZXNjLT5pbmRleDsKLSAgICBmcmFtZS0+Zm9ybWF0ICA9IEFWX1BJ WF9GTVRfRDNEMTE7Ci0gICAgZnJhbWUtPndpZHRoICAgPSBjdHgtPndpZHRoOwotICAgIGZyYW1l LT5oZWlnaHQgID0gY3R4LT5oZWlnaHQ7CisgICAgICAgIGF2X3VzbGVlcCgxMDAwKTsKKyAgICB9 CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogfQogCiBzdGF0 aWMgaW50IGQzZDExdmFfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMoQVZIV0ZyYW1lc0NvbnRleHQgKmN0 eCwKLS0gCjIuMzQuMQoK --_002_PN0P287MB1494A6A5E06359341A401342E152APN0P287MB1494INDP_ 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_PN0P287MB1494A6A5E06359341A401342E152APN0P287MB1494INDP_--