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 7AE0B474E0 for ; Tue, 15 Jul 2025 07:00:21 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 712AA68DBD2; Tue, 15 Jul 2025 10:00:17 +0300 (EEST) Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazon11020085.outbound.protection.outlook.com [52.101.227.85]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id CA77568D8B4 for ; Tue, 15 Jul 2025 10:00:09 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YQ6XY/9Q8tiWht6hbJGCMhBWQNYLyPAEX3rWJArDIzqiFCvbh07vsHSSscMUMSQtYLzhy6YY6dvjr2EnnwY0ssa0zmiy0/S1yDZ4rvfWAmZLIDm6irdGnoFEZY01pjaP1T6VkGxHGcezBxBZ5aa7ID0/SZa3JQyCtfAmoefKjy30rAdXjxkqSIhAHslBgzlsGYTjSJuILOhrry/UGmMyOoCwOUgMw+ZDv7pFpn0b6972FJY7ahU+iGC41kA7rAbe2IlgyhJeDRLa3PqZKgB55YUoCPs0k8oNrPWhxeDKPbzV7g7zpf9mKaIsSCbwN+MsQolZg+2IbtiAPqz2rlCL0w== 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=V3RmP+0ujB4Ib9KMmsMZPiH2okrWZQ6Pd7tPGE7dKkY=; b=KIw65TYjZA/+76jpbeeSln1aInoJPNPOh27cb3J2Ff9kzli6t6/qmh4fmtKj6xXMsJfJ7F0Xw6quUmhyXu9wtrFWQI4SgcT6GK92qNidXy/ozGHFNVAr/7rQ2Awdbo0WdoGTS2vHcLJLaa4g0t7WrKEBHvGRcCNNqHRC3B6XTUO3IPWgegfTrFHetAQAaAPz9IfwqLoWE1SNIiRoDdgdPIkka4PXR1qqWY4X4nCh5F0qjj3m9i2goJBYxfsOdF81RQd8He/Hl/CJh3ugxpyEJJAQI7irwmmHzBWPiXMF2ZiOQEyorE4UzqGfL2+AYPz0YdL6BZnzS9ozVazXJEDmNg== 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=V3RmP+0ujB4Ib9KMmsMZPiH2okrWZQ6Pd7tPGE7dKkY=; b=xuQeMQ40SvNnD2Qr3yP9w22pSuq9AkjFIYiT4Rjh6IOw5HgLPENgEOXzDIfjPE8q8lUyWF8RsubFmiB7KFBmjmt2WrNo17uaMWrJVrIj/n5SkBSEXwvynPUKP7qacizLwrIdLMMTks0T/OnoZ9JOJm4/f69cgK4Ld4G08H/Njd/p0bx8f4KQez5IKLwNRvkvhrhSKXwQmRfffpA46w6sNsB2UzSKXX78jOeyTqHUZRxQaElhoaAxV1ly9N0b6cqPr58SogjqkyosQa4Q9HCqntRl3EO89lAEPfIK/p0e8cqv8jV/Hg/ucoD6mesBFPzUJu/z6pmEWO61fOWwMfFfow== Received: from PN0P287MB1494.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:186::9) by PN0P287MB1633.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:18c::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.35; Tue, 15 Jul 2025 07:00:05 +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.8922.028; Tue, 15 Jul 2025 07:00:05 +0000 From: Dash Santosh Sathyanarayanan To: FFmpeg development discussions and patches Thread-Topic: [PATCH v4 1/2] avfilter: add scale_d3d11 filter Thread-Index: AQHb9VXWocxq2SWZ2kmWlvVjjSPpyg== Date: Tue, 15 Jul 2025 07:00:05 +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_|PN0P287MB1633:EE_ x-ms-office365-filtering-correlation-id: f5db9c85-028f-4725-9688-08ddc36d3a1b x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|366016|1800799024|376014|38070700018|4053099003; x-microsoft-antispam-message-info: =?Windows-1252?Q?+e4e61VvUJIupHjE7GDCq+nik829yqSL/kFzDTiUbSksV61pDNO51uOu?= =?Windows-1252?Q?D816I0gzDUE/2Gc1Ezuns8IisSgngShP4evGCzjxkeBi+vP94YHZSpR4?= =?Windows-1252?Q?PQsqQn0SPBkaAll56gdNBmhZ95iKFCEMK0xCDwx17Uk5gbs/0bP+mL5f?= =?Windows-1252?Q?fJw1E8mBcfQwFMIiCApY+BuVRAruG+uUmhDMfV1nbHnzRZpGwAcvVMd3?= =?Windows-1252?Q?XWGNfa/EJ4R9T8tUCYZ2TcY7j5DIux6sMYMfzcxla78ojxcL4tyHUJtG?= =?Windows-1252?Q?Ato9TnkvMqrNC9TlT2BAx97QunXdvnsqoF1yTcNnAqCfDSz8+3Qovnu9?= =?Windows-1252?Q?yZbl7/Oo7WeFfJa9by3kh7oWZBJhhpDVjrVRI925cYyFTqU0h5T+Xx6D?= =?Windows-1252?Q?R9AcFHw27sso6v4lBxswEa1wt0mlG/pvxedrvpN02pr0yEhB9dPUssdi?= =?Windows-1252?Q?Gw4Pay+eaTPdVnHsvqM7pZQAtPpKA6LzT4XmhItUx2ZlDiYw6tyb4LKQ?= =?Windows-1252?Q?0ViEFLzVnNgUOSljbaJbjbj7kpBdYDhZ2BC0EzUHYoq63EfiBIlMqoPw?= =?Windows-1252?Q?8SyYvVn8LLgoFptDcyIr1PAQI63O84F/FUsN8+9iGtEOjlb5X5rvukMZ?= =?Windows-1252?Q?a/frOrHvK/u56Egd/ImGX2oTI5gwroanS6ZctiOjmWA6Re6hY0X4rgQp?= =?Windows-1252?Q?ew76/hYshG+NPbxZcaWzrEZ4vi+wT7f7F4HeSj8Cc+Af3s5QjOXgymB0?= =?Windows-1252?Q?+j5PjZWSBBNldzgzxVw+3lQhjXZCRE2g8fZEsi/DepUEtEmGiRjiUypO?= =?Windows-1252?Q?g7Es/h56GUuM+ZljXnJKDspA1kj96VJcQ0iJ5SlASodKyoiwb3Zvb8zo?= =?Windows-1252?Q?nHph/SpgR2WMd4j9MVY+xQ7KvFteT0aoec+4fAmu8qiJ8TBu4VPGI/vk?= =?Windows-1252?Q?XSTVXEVrL4k8mo3DDoiqQOJaXlHeH8Z1uDK8vDmtZxOaBZ4WOaoDOYGL?= =?Windows-1252?Q?Ef6EKzjyYxMuYVTzqZd0y1c1pk5TYCZsrPlT0SkXtnQ8CwEy04YOrrR5?= =?Windows-1252?Q?4qnel2AqfgSNpsqCKAP8g66mOG5HtS4Stvny9GByjNUtU6vCu95WlvlE?= =?Windows-1252?Q?bQX0cADm6b4ZgeqxyoBq8olhUErNvdlRt+LeazNTTqyMKulwulFQIpnb?= =?Windows-1252?Q?5f16iq1ZqcoCX6Y6/JkT7p7ANf/B+0nP1svsKMrS9hFwWNLFaZyxMpB9?= =?Windows-1252?Q?J5FHw/UjEFsnurmQu1D+kTNzOyfHtv+MP3xIPCbtpar+1cfHsCbU57Ho?= =?Windows-1252?Q?ebLdsYvKPcjftkQuiV4gbLVLTwGbMJiLVZ8g1zsM0YsPHaZ8mRzxVBVm?= =?Windows-1252?Q?8i5smCuLPvX+pdReUDGMLqX8/nUT7yU5jyD7uB+YVa+LPVBUfnAWApCU?= =?Windows-1252?Q?I4h35dP/Q4bVgF86EM6D8x5Doy5C1Rl+B4CDjIYwd5DieB2A4VuzgVtH?= =?Windows-1252?Q?D54tnRaVgJb8+QbjeSmWxhxQXbA+MfzX6XM+OeMSKBSTHNc75jpDG8b5?= =?Windows-1252?Q?aii9TI9QushOkV2UtcGOzndimckLaLqkwjnHw3GQjU3+qQx/N0WIyUEP?= =?Windows-1252?Q?oX4=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)(366016)(1800799024)(376014)(38070700018)(4053099003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?Windows-1252?Q?hjjwnc190Jbxf1jrtmVtzF99Z1apWz1L0e+oRIOYYIiP1firxh0DghW6?= =?Windows-1252?Q?0XQ9KYSJKBxnK5bK1ih8+mXv2o5BW6YBF9bbEHP8HkTFk1GquLZMSUMS?= =?Windows-1252?Q?RtcDTvEm0zvlfjEn2nTD0leNaugUwoM+eYoh1Izb2DpO61g3GHGQUtVW?= =?Windows-1252?Q?uZAXysZ/JA5FU1vnDyqd4FDFE6SY1gIvBKRp1dI/39BLY/IpLf/Jm5Kz?= =?Windows-1252?Q?o6rkOIUO4caHzAvbFfbTGrn9QEy/+I9LFZQZQHYmu0IWlkckmYbGSiXw?= =?Windows-1252?Q?tgvIoiv8qrs1Caotkw8CK8nhWprfw7Lr60zUz4vdCzjww/GbQOdBiFGz?= =?Windows-1252?Q?eZB+5OBTnC2vg4AAMGx7/xMZO5Vo2fAzsoMKipBjPencb98qOwUAwQVZ?= =?Windows-1252?Q?XJPaT2TGilk1k4zEFhHbLU9tW62vU5HYCxvywA4J0p/aWxvqVwu0o/3C?= =?Windows-1252?Q?5U8FgIdrovtML2wm0fNJAsDOGsOU69/kIfrKbVMiFTiuWZDRSx/XR8Uy?= =?Windows-1252?Q?v9uNech2cciKdHQGU4QmfhpGNyZvl4EFXWuOJGlSaDNF1r0ru4IoJEx0?= =?Windows-1252?Q?zjUM50cO1I0clZIv8y3LVlhTeQT1IX3Byd+ReSJBSHcX8fiZxUe9tKBZ?= =?Windows-1252?Q?c6xe3qNLnBUFABEDCUcEw0l1/HTcdal/uJ7qre1pycRihxtG+spbR8Vb?= =?Windows-1252?Q?wKftmMjbgUzcG9mLfvfjTMnpRfHw2TdHzMu3Zd7Uw809R1GoCeLnfCoG?= =?Windows-1252?Q?yJxNNRYSF1MGKj04LhtqgDHFHIIiX/lRwDD99e9U1FXeceD7+HU7csjW?= =?Windows-1252?Q?Ktgl21gWoPPVp22UhjENByGdBq+o43jeOwBBYbXvNpz9nhezs0/DKpK/?= =?Windows-1252?Q?LWSomy3HwTWUqGcDnKd0r2PpRn8B5ivVcFqGVUd0XLhHVtwekx128wFc?= =?Windows-1252?Q?9U/RgFNENDrKiQL82rr+GfoGCMxj8QpfZaE+nCYRBJm8tOPi0VGRqFeW?= =?Windows-1252?Q?o9KdkQK70Aft05s3NOjrogm7ux6eUmGhYixcuTaY3zGg6sUp1F1TZS8f?= =?Windows-1252?Q?fKGUxj8/znflGkK6ClgaO632ezdnzsHkgrDMwAZ87liaNMPpTGewb47A?= =?Windows-1252?Q?U0up3HuHN1WQ7qJ3iuIBQ+x6hbyduASJXX1d45eeCG3u8j/+Fc4EKTME?= =?Windows-1252?Q?9NusS51RteOkYYHVuTimWYk+0StM/Wbnrc+PYrkjlopMEVdbsZHpr185?= =?Windows-1252?Q?Wj3oXE8zTYXpPHdmp4A4j5QhhDLN/GPxHd2NZPH3CrR2wNRrmD6fC3ET?= =?Windows-1252?Q?eiyS9LNCAFPMLdFTOPMHePIkgZbAO2u9U/hcTtOkBfeV4vEwOel650uA?= =?Windows-1252?Q?hWl6mDckiv4MBXZtq1fY441j+pWWXA3jlkSUKBQXKt00kjJHkQmIxLt+?= =?Windows-1252?Q?6A32pw0Tr/eDFE/dwrKC9Zo2LnRAfXNc3SVB/CLSLAXVPddhVJxvpRN6?= =?Windows-1252?Q?MmVjRzYzBCk9Yhp4wBmH8WLqHM+fVWXlbivYTfGZ8ltHV6KAhYJ8Ht41?= =?Windows-1252?Q?FduB9fIRZEdqWVD9YMHlyFY6fI/GbhBoXUTkOjh7ADfYSqTYLgVjbatj?= =?Windows-1252?Q?EaR9OO4qLAmhMypbelY1ekcdcErW/h+MZshpVmDaBjyxmazM/YA8/yaQ?= =?Windows-1252?Q?CsYxmwIqrbrDEwISoN8PF6vMNSub8+crU5fE+GYnnB2BmeNXnFPIAvaf?= =?Windows-1252?Q?IaDgQEoq2A0q0+CHnbw=3D?= Content-Type: multipart/mixed; boundary="_002_PN0P287MB149478F5A456E224B1163A11E157APN0P287MB1494INDP_" 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: f5db9c85-028f-4725-9688-08ddc36d3a1b X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Jul 2025 07:00:05.0150 (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: 7fgOqg4pwdV0UdRZXfLJeebBGwKW09Sz/ZaFewiPxEuKbGr9PuibyWJNIRHpqFU1ldtwe7pB9aI1KQe5QBSmUJUCXEZ0c63/pj9AJPpZgDVcP8sJo30wepZhHj+farbG5J5ZuJqvohnaqyMbZGuO4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PN0P287MB1633 Subject: [FFmpeg-devel] [PATCH v4 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_PN0P287MB149478F5A456E224B1163A11E157APN0P287MB1494INDP_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable > > This part is still not acceptable. You blindly set a flag based on=0A= > > what you need, if special flags on the context are needed they should= =0A= > > be negotiated between the different components, guided by the users=0A= > > use-case and input, and not hardcoded based on an arbitrary condition= =0A= > > of a pixel format.=0A= > =0A= > Couldn't find a way to negotiate between decoder and encoder, but it shou= ld=0A= > be possible to use scale_d3d11 filter as passthrough from which the outpu= t=0A= > can be sent directly to the encoder. So removed the change from dxva2.c= =0A= > =0A= > > A potentially infinite loop in get_buffer is an absolute no-go. There= =0A= > > is no way to control this behavior, and the surface may never become=0A= > > available if the caller is blocked in a loop here. You assume a=0A= > > certain threading model which may not exist.=0A= > > This sort of behavior should be handled by the caller, not here (and=0A= > > no, a maximum wait time or anything like that does not resolve this=0A= > > concern, move it to another layer where the caller can control this).= =0A= > =0A= > Thanks for the feedback. I did try moving the wait logic out of get_buffe= r,=0A= > but couldn't find a clean way to handle it at a different layer. Without = the loop,=0A= > it ends up breaking the pipeline with a =93static surface pool size excee= ded=94=0A= > error, as all surfaces remain busy.=0A= > =0A= > I also attempted returning EAGAIN instead of ENOMEM, but that leads to an= =0A= > assertion failure in the decoder path - apparently EAGAIN isn=92t expecte= d at that=0A= > stage and causes a hard abort.=0A= > =0A= > At this point I=92m honestly not sure how to proceed. I'd really apprecia= te any=0A= > guidance or suggestions on alternative approaches that might work here.= =0A= > Sorry if I=92m missing something obvious.=0A= =0A= Fixed FATE test failures. Please let me know if get_buffer loop can be impl= emented=0A= in a better way. Thanks=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 | 37 ++-=0A= 6 files changed, 494 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..a5947e1618 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= @@ -288,6 +290,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= @@ -340,19 +344,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_PN0P287MB149478F5A456E224B1163A11E157APN0P287MB1494INDP_ Content-Type: application/octet-stream; name="v4-0001-avfilter-add-scale_d3d11-filter.patch" Content-Description: v4-0001-avfilter-add-scale_d3d11-filter.patch Content-Disposition: attachment; filename="v4-0001-avfilter-add-scale_d3d11-filter.patch"; size=21852; creation-date="Tue, 15 Jul 2025 06:59:07 GMT"; modification-date="Tue, 15 Jul 2025 06:59:07 GMT" Content-Transfer-Encoding: base64 RnJvbSAzZDU4N2RjY2ZiNzE5Y2MxYzY3NzczOWQ0M2UxZDEwNGY4MTc3ZjlhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXNoIFNhbnRvc2ggPGRhc2guc2F0aHlhbmFyYXlhbmFuQG11 bHRpY29yZXdhcmVpbmMuY29tPgpEYXRlOiBXZWQsIDExIEp1biAyMDI1IDA1OjI2OjE5IC0wNzAw ClN1YmplY3Q6IFtQQVRDSCB2NCAxLzJdIGF2ZmlsdGVyOiBhZGQgc2NhbGVfZDNkMTEgZmlsdGVy CgpUaGlzIGNvbW1pdCBpbnRyb2R1Y2VzIGEgbmV3IGhhcmR3YXJlLWFjY2VsZXJhdGVkIHZpZGVv IGZpbHRlciwgc2NhbGVfZDNkMTEsCndoaWNoIHBlcmZvcm1zIHNjYWxpbmcgYW5kIGZvcm1hdCBj b252ZXJzaW9uIHVzaW5nIERpcmVjdDNEIDExLiBUaGUgZmlsdGVyIGVuYWJsZXMKZWZmaWNpZW50 IEdQVS1iYXNlZCBzY2FsaW5nIGFuZCBwaXhlbCBmb3JtYXQgY29udmVyc2lvbiAocDAxMCB0byBu djEyKSwgcmVkdWNpbmcKQ1BVIG92ZXJoZWFkIGFuZCBsYXRlbmN5IGluIHZpZGVvIHBpcGVsaW5l cy4KLS0tCiBDaGFuZ2Vsb2cgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBjb25maWd1cmUg ICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBsaWJhdmZpbHRlci9NYWtlZmlsZSAgICAgICAg ICB8ICAgMSArCiBsaWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMgICAgICB8ICAgMSArCiBsaWJhdmZp bHRlci92Zl9zY2FsZV9kM2QxMS5jICB8IDQ2NCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBsaWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuYyB8ICAzNyArKy0KIDYgZmlsZXMg Y2hhbmdlZCwgNDk0IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGxpYmF2ZmlsdGVyL3ZmX3NjYWxlX2QzZDExLmMKCmRpZmYgLS1naXQgYS9DaGFuZ2Vs b2cgYi9DaGFuZ2Vsb2cKaW5kZXggNDIxNzQ0OTQzOC4uNTYxMjJlZjU1NSAxMDA2NDQKLS0tIGEv Q2hhbmdlbG9nCisrKyBiL0NoYW5nZWxvZwpAQCAtMTgsNiArMTgsNyBAQCB2ZXJzaW9uIDxuZXh0 PjoKIC0gQVBWIGVuY29kaW5nIHN1cHBvcnQgdGhyb3VnaCBhIGxpYm9wZW5hcHYgd3JhcHBlcgog LSBWVkMgZGVjb2RlciBzdXBwb3J0cyBhbGwgY29udGVudCBvZiBTQ0MgKFNjcmVlbiBDb250ZW50 IENvZGluZyk6CiAgIElCQyAoSW50ZXIgQmxvY2sgQ29weSksIFBhbGV0dGUgTW9kZSBhbmQgQUNU IChBZGFwdGl2ZSBDb2xvciBUcmFuc2Zvcm0KKy0gQWRkIHZmX3NjYWxlX2QzZDExIGZpbHRlcgog CiAKIHZlcnNpb24gNy4xOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4 IGExZjQ4M2YwMmMuLjEwYzdjOWU3YjUgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25m aWd1cmUKQEAgLTMzNTksNiArMzM1OSw3IEBAIG92ZXJsYXlfY3VkYV9maWx0ZXJfZGVwc19hbnk9 ImN1ZGFfbnZjYyBjdWRhX2xsdm0iCiBzaGFycGVuX25wcF9maWx0ZXJfZGVwcz0iZmZudmNvZGVj IGxpYm5wcCIKIAogZGRhZ3JhYl9maWx0ZXJfZGVwcz0iZDNkMTF2YSBJRFhHSU91dHB1dDEgRFhH SV9PVVREVVBMX0ZSQU1FX0lORk8iCitzY2FsZV9kM2QxMV9maWx0ZXJfZGVwcz0iZDNkMTF2YSIK IAogYW1mX2RlcHNfYW55PSJsaWJkbCBMb2FkTGlicmFyeSIKIG52ZW5jX2RlcHM9ImZmbnZjb2Rl YyIKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL01ha2VmaWxlIGIvbGliYXZmaWx0ZXIvTWFrZWZp bGUKaW5kZXggOTdmOGYxNzI3Mi4uOTU2MTJkNzUzZCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIv TWFrZWZpbGUKKysrIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUKQEAgLTQ2Miw2ICs0NjIsNyBAQCBP QkpTLSQoQ09ORklHX1JPQkVSVFNfT1BFTkNMX0ZJTFRFUikgICAgICAgICArPSB2Zl9jb252b2x1 dGlvbl9vcGVuY2wubyBvcGVuY2wubwogT0JKUy0kKENPTkZJR19ST1RBVEVfRklMVEVSKSAgICAg ICAgICAgICAgICAgKz0gdmZfcm90YXRlLm8KIE9CSlMtJChDT05GSUdfU0FCX0ZJTFRFUikgICAg ICAgICAgICAgICAgICAgICs9IHZmX3NhYi5vCiBPQkpTLSQoQ09ORklHX1NDQUxFX0ZJTFRFUikg ICAgICAgICAgICAgICAgICArPSB2Zl9zY2FsZS5vIHNjYWxlX2V2YWwubyBmcmFtZXN5bmMubwor T0JKUy0kKENPTkZJR19TQ0FMRV9EM0QxMV9GSUxURVIpICAgICAgICAgICAgKz0gdmZfc2NhbGVf ZDNkMTEubyBzY2FsZV9ldmFsLm8KIE9CSlMtJChDT05GSUdfU0NBTEVfQ1VEQV9GSUxURVIpICAg ICAgICAgICAgICs9IHZmX3NjYWxlX2N1ZGEubyBzY2FsZV9ldmFsLm8gXAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZfc2NhbGVfY3VkYS5wdHgubyBj dWRhL2xvYWRfaGVscGVyLm8KIE9CSlMtJChDT05GSUdfU0NBTEVfTlBQX0ZJTFRFUikgICAgICAg ICAgICAgICs9IHZmX3NjYWxlX25wcC5vIHNjYWxlX2V2YWwubwpkaWZmIC0tZ2l0IGEvbGliYXZm aWx0ZXIvYWxsZmlsdGVycy5jIGIvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jCmluZGV4IDNiYzA0 NWIyOGYuLmVjNWUwOTQ5NGEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwor KysgYi9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMKQEAgLTQzNiw2ICs0MzYsNyBAQCBleHRlcm4g Y29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGU7CiBleHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZf dnBwX2FtZjsKIGV4dGVybiBjb25zdCBGRkZpbHRlciBmZl92Zl9zcl9hbWY7CiBleHRlcm4gY29u c3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVfY3VkYTsKK2V4dGVybiBjb25zdCBGRkZpbHRlciBmZl92 Zl9zY2FsZV9kM2QxMTsKIGV4dGVybiBjb25zdCBGRkZpbHRlciBmZl92Zl9zY2FsZV9ucHA7CiBl eHRlcm4gY29uc3QgRkZGaWx0ZXIgZmZfdmZfc2NhbGVfcXN2OwogZXh0ZXJuIGNvbnN0IEZGRmls dGVyIGZmX3ZmX3NjYWxlX3ZhYXBpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc2NhbGVf ZDNkMTEuYyBiL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlX2QzZDExLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMC4uMGI3NDc2ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2 ZmlsdGVyL3ZmX3NjYWxlX2QzZDExLmMKQEAgLTAsMCArMSw0NjQgQEAKKy8qCisgKiBDb3B5cmln aHQgKEMpIDIwMjUgTXVsdGljb3Jld1dhcmUsIEluYy4KKyAqCisgKiBBdXRob3JzOiBEYXNoIFNh bnRvc2ggPGRhc2guc2F0aGFuYXRheWFuYW5AbXVsdGljb3Jld2FyZWluYy5jb20+CisgKiAgICAg ICAgICBTYWNoaW4gPHNhY2hpbi5wcmFrYXNoQG11bHRpY29yZXdhcmVpbmMuY29tPgorICoKKyAq IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl cnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExp Y2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29w dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiY29tcGF0L3cz MmRsZmNuLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAi bGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmgiCisKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCisj aW5jbHVkZSAic2NhbGVfZXZhbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3Ry dWN0IFNjYWxlRDNEMTFDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzc0N0eDsKKyAg ICBjaGFyICp3X2V4cHI7CisgICAgY2hhciAqaF9leHByOworICAgIGVudW0gQVZQaXhlbEZvcm1h dCBmb3JtYXQ7CisKKyAgICAvLy88IEQzRDExIG9iamVjdHMKKyAgICBJRDNEMTFEZXZpY2UgKmRl dmljZTsKKyAgICBJRDNEMTFEZXZpY2VDb250ZXh0ICpjb250ZXh0OworICAgIElEM0QxMVZpZGVv RGV2aWNlICp2aWRlb0RldmljZTsKKyAgICBJRDNEMTFWaWRlb1Byb2Nlc3NvciAqcHJvY2Vzc29y OworICAgIElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvciAqZW51bWVyYXRvcjsKKyAgICBJ RDNEMTFWaWRlb1Byb2Nlc3Nvck91dHB1dFZpZXcgKm91dHB1dFZpZXc7CisgICAgSUQzRDExVmlk ZW9Qcm9jZXNzb3JJbnB1dFZpZXcgKmlucHV0VmlldzsKKworICAgIC8vLzwgQnVmZmVyIHJlZmVy ZW5jZXMKKyAgICBBVkJ1ZmZlclJlZiAqaHdfZGV2aWNlX2N0eDsKKyAgICBBVkJ1ZmZlclJlZiAq aHdfZnJhbWVzX2N0eF9vdXQ7CisKKyAgICAvLy88IERpbWVuc2lvbnMgYW5kIGZvcm1hdHMKKyAg ICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQ7Cisg ICAgRFhHSV9GT1JNQVQgaW5wdXRfZm9ybWF0OworICAgIERYR0lfRk9STUFUIG91dHB1dF9mb3Jt YXQ7Cit9IFNjYWxlRDNEMTFDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgc2NhbGVfZDNk MTFfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkgeworICAgIC8vLzwgYWxsIHJlYWwgd29yayBp cyBkb25lIGluIGNvbmZpZ19wcm9wcyBhbmQgZmlsdGVyX2ZyYW1lCisgICAgcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZDNkMTFfcmVzb3VyY2VzKFNjYWxlRDNEMTFDb250ZXh0 ICpzKSB7CisgICAgaWYgKHMtPm91dHB1dFZpZXcpIHsKKyAgICAgICAgcy0+b3V0cHV0Vmlldy0+ bHBWdGJsLT5SZWxlYXNlKHMtPm91dHB1dFZpZXcpOworICAgICAgICBzLT5vdXRwdXRWaWV3ID0g TlVMTDsKKyAgICB9CisKKyAgICBpZiAocy0+cHJvY2Vzc29yKSB7CisgICAgICAgIHMtPnByb2Nl c3Nvci0+bHBWdGJsLT5SZWxlYXNlKHMtPnByb2Nlc3Nvcik7CisgICAgICAgIHMtPnByb2Nlc3Nv ciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPmVudW1lcmF0b3IpIHsKKyAgICAgICAgcy0+ ZW51bWVyYXRvci0+bHBWdGJsLT5SZWxlYXNlKHMtPmVudW1lcmF0b3IpOworICAgICAgICBzLT5l bnVtZXJhdG9yID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocy0+dmlkZW9EZXZpY2UpIHsKKyAg ICAgICAgcy0+dmlkZW9EZXZpY2UtPmxwVnRibC0+UmVsZWFzZShzLT52aWRlb0RldmljZSk7Cisg ICAgICAgIHMtPnZpZGVvRGV2aWNlID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2Nh bGVfZDNkMTFfY29uZmlndXJlX3Byb2Nlc3NvcihTY2FsZUQzRDExQ29udGV4dCAqcywgQVZGaWx0 ZXJDb250ZXh0ICpjdHgpIHsKKyAgICBIUkVTVUxUIGhyOworCisgICAgc3dpdGNoIChzLT5mb3Jt YXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgICAgICBzLT5vdXRw dXRfZm9ybWF0ID0gRFhHSV9GT1JNQVRfTlYxMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg ICBjYXNlIEFWX1BJWF9GTVRfUDAxMDoKKyAgICAgICAgICAgIHMtPm91dHB1dF9mb3JtYXQgPSBE WEdJX0ZPUk1BVF9QMDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6Cisg ICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG91dHB1dCBmb3Jt YXQgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cisg ICAgfQorCisgICAgLy8vPCBHZXQgRDNEMTEgZGV2aWNlIGFuZCBjb250ZXh0IGZyb20gaGFyZHdh cmUgZGV2aWNlIGNvbnRleHQKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqaHdjdHggPSAoQVZIV0Rl dmljZUNvbnRleHQgKilzLT5od19kZXZpY2VfY3R4LT5kYXRhOworICAgIEFWRDNEMTFWQURldmlj ZUNvbnRleHQgKmQzZDExX2h3Y3R4ID0gKEFWRDNEMTFWQURldmljZUNvbnRleHQgKilod2N0eC0+ aHdjdHg7CisgICAgcy0+ZGV2aWNlID0gZDNkMTFfaHdjdHgtPmRldmljZTsKKyAgICBzLT5jb250 ZXh0ID0gZDNkMTFfaHdjdHgtPmRldmljZV9jb250ZXh0OworCisgICAgYXZfbG9nKGN0eCwgQVZf TE9HX1ZFUkJPU0UsICJDb25maWd1cmluZyBEM0QxMSB2aWRlbyBwcm9jZXNzb3I6ICVkeCVkIC0+ ICVkeCVkXG4iLAorICAgICAgICAgICBzLT5pbnB1dFdpZHRoLCBzLT5pbnB1dEhlaWdodCwgcy0+ d2lkdGgsIHMtPmhlaWdodCk7CisKKyAgICAvLy88IERlZmluZSB0aGUgdmlkZW8gcHJvY2Vzc29y IGNvbnRlbnQgZGVzY3JpcHRpb24KKyAgICBEM0QxMV9WSURFT19QUk9DRVNTT1JfQ09OVEVOVF9E RVNDIGNvbnRlbnREZXNjID0geworICAgICAgICAuSW5wdXRGcmFtZUZvcm1hdCA9IEQzRDExX1ZJ REVPX0ZSQU1FX0ZPUk1BVF9QUk9HUkVTU0lWRSwKKyAgICAgICAgLklucHV0V2lkdGggPSBzLT5p bnB1dFdpZHRoLAorICAgICAgICAuSW5wdXRIZWlnaHQgPSBzLT5pbnB1dEhlaWdodCwKKyAgICAg ICAgLk91dHB1dFdpZHRoID0gcy0+d2lkdGgsCisgICAgICAgIC5PdXRwdXRIZWlnaHQgPSBzLT5o ZWlnaHQsCisgICAgICAgIC5Vc2FnZSA9IEQzRDExX1ZJREVPX1VTQUdFX1BMQVlCQUNLX05PUk1B TCwKKyAgICB9OworCisgICAgLy8vPCBRdWVyeSB2aWRlbyBkZXZpY2UgaW50ZXJmYWNlCisgICAg aHIgPSBzLT5kZXZpY2UtPmxwVnRibC0+UXVlcnlJbnRlcmZhY2Uocy0+ZGV2aWNlLCAmSUlEX0lE M0QxMVZpZGVvRGV2aWNlLCAodm9pZCAqKikmcy0+dmlkZW9EZXZpY2UpOworICAgIGlmIChGQUlM RUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBn ZXQgRDNEMTEgdmlkZW8gZGV2aWNlIGludGVyZmFjZTogSFJFU1VMVCAweCVsWFxuIiwgaHIpOwor ICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICAvLy88IENyZWF0 ZSB2aWRlbyBwcm9jZXNzb3IgZW51bWVyYXRvcgorICAgIGhyID0gcy0+dmlkZW9EZXZpY2UtPmxw VnRibC0+Q3JlYXRlVmlkZW9Qcm9jZXNzb3JFbnVtZXJhdG9yKHMtPnZpZGVvRGV2aWNlLCAmY29u dGVudERlc2MsICZzLT5lbnVtZXJhdG9yKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAg ICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvIHByb2Nl c3NvciBlbnVtZXJhdG9yOiBIUkVTVUxUIDB4JWxYXG4iLCBocik7CisgICAgICAgIHJldHVybiBB VkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIC8vLzwgQ3JlYXRlIHRoZSB2aWRlbyBwcm9j ZXNzb3IKKyAgICBociA9IHMtPnZpZGVvRGV2aWNlLT5scFZ0YmwtPkNyZWF0ZVZpZGVvUHJvY2Vz c29yKHMtPnZpZGVvRGV2aWNlLCBzLT5lbnVtZXJhdG9yLCAwLCAmcy0+cHJvY2Vzc29yKTsKKyAg ICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJG YWlsZWQgdG8gY3JlYXRlIHZpZGVvIHByb2Nlc3NvcjogSFJFU1VMVCAweCVsWFxuIiwgaHIpOwor ICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4 LCBBVl9MT0dfVkVSQk9TRSwgIkQzRDExIHZpZGVvIHByb2Nlc3NvciBzdWNjZXNzZnVsbHkgY29u ZmlndXJlZFxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhbGVfZDNkMTFf ZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBB VkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFNjYWxlRDNEMTFDb250ZXh0 ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0 c1swXTsKKyAgICBJRDNEMTFWaWRlb1Byb2Nlc3NvcklucHV0VmlldyAqaW5wdXRWaWV3ID0gTlVM TDsKKyAgICBJRDNEMTFWaWRlb0NvbnRleHQgKnZpZGVvQ29udGV4dCA9IE5VTEw7CisgICAgQVZG cmFtZSAqb3V0ID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBIUkVTVUxUIGhyOworCisg ICAgLy8vPCBWYWxpZGF0ZSBpbnB1dCBmcmFtZQorICAgIGlmICghaW4pIHsKKyAgICAgICAgYXZf bG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTnVsbCBpbnB1dCBmcmFtZVxuIik7CisgICAgICAgIHJl dHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFpbi0+aHdfZnJhbWVzX2N0 eCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBoYXJkd2FyZSBmcmFt ZXMgY29udGV4dCBpbiBpbnB1dCBmcmFtZVxuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlu KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLy88IFZl cmlmeSBoYXJkd2FyZSBkZXZpY2UgY29udGV4dHMKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJh bWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCAqKWluLT5od19mcmFtZXNfY3R4LT5kYXRhOwor CisgICAgaWYgKCFzLT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xP R19FUlJPUiwgIkZpbHRlciBoYXJkd2FyZSBkZXZpY2UgY29udGV4dCBpcyB1bmluaXRpYWxpemVk XG4iKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJP UihFSU5WQUwpOworICAgIH0KKworICAgIEFWSFdEZXZpY2VDb250ZXh0ICppbnB1dF9kZXZpY2Vf Y3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0ICopZnJhbWVzX2N0eC0+ZGV2aWNlX3JlZi0+ZGF0YTsK KyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZmlsdGVyX2RldmljZV9jdHggPSAoQVZIV0RldmljZUNv bnRleHQgKilzLT5od19kZXZpY2VfY3R4LT5kYXRhOworCisgICAgaWYgKGlucHV0X2RldmljZV9j dHgtPnR5cGUgIT0gZmlsdGVyX2RldmljZV9jdHgtPnR5cGUpIHsKKyAgICAgICAgYXZfbG9nKGN0 eCwgQVZfTE9HX0VSUk9SLCAiTWlzbWF0Y2ggYmV0d2VlbiBpbnB1dCBhbmQgZmlsdGVyIGhhcmR3 YXJlIGRldmljZSB0eXBlc1xuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAg ICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvLy88IEFsbG9jYXRlIG91 dHB1dCBmcmFtZQorICAgIG91dCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFvdXQpIHsK KyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG91 dHB1dCBmcmFtZVxuIik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0 dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX2dldF9i dWZmZXIocy0+aHdfZnJhbWVzX2N0eF9vdXQsIG91dCwgMCk7CisgICAgaWYgKHJldCA8IDApIHsK KyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBvdXRwdXQg ZnJhbWUgZnJvbSBwb29sXG4iKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAg ICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAg IC8vLzwgQ29uZmlndXJlIHRoZSBEM0QxMSB2aWRlbyBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkg Y29uZmlndXJlZAorICAgIGlmICghcy0+cHJvY2Vzc29yKSB7CisgICAgICAgIC8vLzwgR2V0IGlu Zm8gZnJvbSBpbnB1dCB0ZXh0dXJlCisgICAgICAgIEQzRDExX1RFWFRVUkUyRF9ERVNDIHRleHR1 cmVEZXNjOworICAgICAgICBJRDNEMTFUZXh0dXJlMkQgKmlucHV0X3RleHR1cmUgPSAoSUQzRDEx VGV4dHVyZTJEICopaW4tPmRhdGFbMF07CisgICAgICAgIGlucHV0X3RleHR1cmUtPmxwVnRibC0+ R2V0RGVzYyhpbnB1dF90ZXh0dXJlLCAmdGV4dHVyZURlc2MpOworCisgICAgICAgIHMtPmlucHV0 V2lkdGggPSB0ZXh0dXJlRGVzYy5XaWR0aDsKKyAgICAgICAgcy0+aW5wdXRIZWlnaHQgPSB0ZXh0 dXJlRGVzYy5IZWlnaHQ7CisgICAgICAgIHMtPmlucHV0X2Zvcm1hdCA9IHRleHR1cmVEZXNjLkZv cm1hdDsKKworICAgICAgICByZXQgPSBzY2FsZV9kM2QxMV9jb25maWd1cmVfcHJvY2Vzc29yKHMs IGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBB Vl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY29uZmlndXJlIHByb2Nlc3NvclxuIik7CisgICAgICAg ICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQp OworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLzwg R2V0IGlucHV0IHRleHR1cmUgYW5kIHByZXBhcmUgaW5wdXQgdmlldworICAgIElEM0QxMVRleHR1 cmUyRCAqZDNkMTFfdGV4dHVyZSA9IChJRDNEMTFUZXh0dXJlMkQgKilpbi0+ZGF0YVswXTsKKyAg ICBpbnQgc3ViSWR4ID0gKGludCkoaW50cHRyX3QpaW4tPmRhdGFbMV07CisKKyAgICBEM0QxMV9W SURFT19QUk9DRVNTT1JfSU5QVVRfVklFV19ERVNDIGlucHV0Vmlld0Rlc2MgPSB7CisgICAgICAg IC5Gb3VyQ0MgPSBzLT5pbnB1dF9mb3JtYXQsCisgICAgICAgIC5WaWV3RGltZW5zaW9uID0gRDNE MTFfVlBJVl9ESU1FTlNJT05fVEVYVFVSRTJELAorICAgICAgICAuVGV4dHVyZTJELkFycmF5U2xp Y2UgPSBzdWJJZHgKKyAgICB9OworCisgICAgaHIgPSBzLT52aWRlb0RldmljZS0+bHBWdGJsLT5D cmVhdGVWaWRlb1Byb2Nlc3NvcklucHV0VmlldygKKyAgICAgICAgcy0+dmlkZW9EZXZpY2UsIChJ RDNEMTFSZXNvdXJjZSAqKWQzZDExX3RleHR1cmUsIHMtPmVudW1lcmF0b3IsICZpbnB1dFZpZXdE ZXNjLCAmaW5wdXRWaWV3KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2co Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGlucHV0IHZpZXc6IEhSRVNVTFQg MHglbFhcbiIsIGhyKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICBhdl9m cmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9 CisKKyAgICAvLy88IENyZWF0ZSBvdXRwdXQgdmlldyBmb3IgY3VycmVudCB0ZXh0dXJlCisgICAg SUQzRDExVGV4dHVyZTJEICpvdXRwdXRfdGV4dHVyZSA9IChJRDNEMTFUZXh0dXJlMkQgKilvdXQt PmRhdGFbMF07CisgICAgRDNEMTFfVklERU9fUFJPQ0VTU09SX09VVFBVVF9WSUVXX0RFU0Mgb3V0 cHV0Vmlld0Rlc2MgPSB7CisgICAgICAgIC5WaWV3RGltZW5zaW9uID0gRDNEMTFfVlBPVl9ESU1F TlNJT05fVEVYVFVSRTJELAorICAgICAgICAuVGV4dHVyZTJEID0geyAuTWlwU2xpY2UgPSAwIH0s CisgICAgfTsKKworICAgIGhyID0gcy0+dmlkZW9EZXZpY2UtPmxwVnRibC0+Q3JlYXRlVmlkZW9Q cm9jZXNzb3JPdXRwdXRWaWV3KAorICAgICAgICBzLT52aWRlb0RldmljZSwgKElEM0QxMVJlc291 cmNlICopb3V0cHV0X3RleHR1cmUsIHMtPmVudW1lcmF0b3IsICZvdXRwdXRWaWV3RGVzYywgJnMt Pm91dHB1dFZpZXcpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgs IEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IHZpZXc6IEhSRVNVTFQgMHgl bFhcbiIsIGhyKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICBhdl9mcmFt ZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisK KyAgICAvLy88IFNldCB1cCBwcm9jZXNzaW5nIHN0cmVhbQorICAgIEQzRDExX1ZJREVPX1BST0NF U1NPUl9TVFJFQU0gc3RyZWFtID0geworICAgICAgICAuRW5hYmxlID0gVFJVRSwKKyAgICAgICAg LnBJbnB1dFN1cmZhY2UgPSBpbnB1dFZpZXcsCisgICAgICAgIC5PdXRwdXRJbmRleCA9IDAKKyAg ICB9OworCisgICAgLy8vPCBHZXQgdmlkZW8gY29udGV4dAorICAgIGhyID0gcy0+Y29udGV4dC0+ bHBWdGJsLT5RdWVyeUludGVyZmFjZShzLT5jb250ZXh0LCAmSUlEX0lEM0QxMVZpZGVvQ29udGV4 dCwgKHZvaWQgKiopJnZpZGVvQ29udGV4dCk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAg ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCB2aWRlbyBjb250ZXh0 OiBIUkVTVUxUIDB4JWxYXG4iLCBocik7CisgICAgICAgIGlucHV0Vmlldy0+bHBWdGJsLT5SZWxl YXNlKGlucHV0Vmlldyk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgYXZf ZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAg fQorCisgICAgLy8vPCBQcm9jZXNzIHRoZSBmcmFtZQorICAgIGhyID0gdmlkZW9Db250ZXh0LT5s cFZ0YmwtPlZpZGVvUHJvY2Vzc29yQmx0KHZpZGVvQ29udGV4dCwgcy0+cHJvY2Vzc29yLCBzLT5v dXRwdXRWaWV3LCAwLCAxLCAmc3RyZWFtKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAg ICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJWaWRlb1Byb2Nlc3NvckJsdCBmYWlsZWQ6IEhS RVNVTFQgMHglbFhcbiIsIGhyKTsKKyAgICAgICAgdmlkZW9Db250ZXh0LT5scFZ0YmwtPlJlbGVh c2UodmlkZW9Db250ZXh0KTsKKyAgICAgICAgaW5wdXRWaWV3LT5scFZ0YmwtPlJlbGVhc2UoaW5w dXRWaWV3KTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICBhdl9mcmFtZV9m cmVlKCZvdXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAg ICAvLy88IFNldCB1cCBvdXRwdXQgZnJhbWUKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3Bz KG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xP R19FUlJPUiwgIkZhaWxlZCB0byBjb3B5IGZyYW1lIHByb3BlcnRpZXNcbiIpOworICAgICAgICB2 aWRlb0NvbnRleHQtPmxwVnRibC0+UmVsZWFzZSh2aWRlb0NvbnRleHQpOworICAgICAgICBpbnB1 dFZpZXctPmxwVnRibC0+UmVsZWFzZShpbnB1dFZpZXcpOworICAgICAgICBhdl9mcmFtZV9mcmVl KCZpbik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgICAgIHJldHVybiByZXQ7 CisgICAgfQorCisgICAgb3V0LT5kYXRhWzBdID0gKHVpbnQ4X3QgKilvdXRwdXRfdGV4dHVyZTsK KyAgICBvdXQtPmRhdGFbMV0gPSAodWludDhfdCAqKShpbnRwdHJfdCkwOworICAgIG91dC0+d2lk dGggPSBzLT53aWR0aDsKKyAgICBvdXQtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBvdXQtPmZv cm1hdCA9IEFWX1BJWF9GTVRfRDNEMTE7CisKKyAgICAvLy88IENsZWFuIHVwIHJlc291cmNlcwor ICAgIGlucHV0Vmlldy0+bHBWdGJsLT5SZWxlYXNlKGlucHV0Vmlldyk7CisgICAgdmlkZW9Db250 ZXh0LT5scFZ0YmwtPlJlbGVhc2UodmlkZW9Db250ZXh0KTsKKyAgICBpZiAocy0+b3V0cHV0Vmll dykgeworICAgICAgICBzLT5vdXRwdXRWaWV3LT5scFZ0YmwtPlJlbGVhc2Uocy0+b3V0cHV0Vmll dyk7CisgICAgICAgIHMtPm91dHB1dFZpZXcgPSBOVUxMOworICAgIH0KKyAgICBhdl9mcmFtZV9m cmVlKCZpbik7CisKKyAgICAvLy88IEZvcndhcmQgdGhlIGZyYW1lCisgICAgcmV0dXJuIGZmX2Zp bHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHNjYWxlX2QzZDExX2Nv bmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0 ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2NhbGVEM0QxMUNvbnRleHQgKnMgPSBjdHgtPnBy aXY7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBGaWx0 ZXJMaW5rICppbmwgPSBmZl9maWx0ZXJfbGluayhpbmxpbmspOworICAgIEZpbHRlckxpbmsgKm91 dGwgPSBmZl9maWx0ZXJfbGluayhvdXRsaW5rKTsKKyAgICBpbnQgcmV0OworCisgICAgLy8vPCBD bGVhbiB1cCBhbnkgcHJldmlvdXMgcmVzb3VyY2VzCisgICAgcmVsZWFzZV9kM2QxMV9yZXNvdXJj ZXMocyk7CisKKyAgICAvLy88IEV2YWx1YXRlIG91dHB1dCBkaW1lbnNpb25zCisgICAgcmV0ID0g ZmZfc2NhbGVfZXZhbF9kaW1lbnNpb25zKHMsIHMtPndfZXhwciwgcy0+aF9leHByLCBpbmxpbmss IG91dGxpbmssICZzLT53aWR0aCwgJnMtPmhlaWdodCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAg ICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGV2YWx1YXRlIGRpbWVu c2lvbnNcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG91dGxpbmstPncg PSBzLT53aWR0aDsKKyAgICBvdXRsaW5rLT5oID0gcy0+aGVpZ2h0OworCisgICAgLy8vPCBWYWxp ZGF0ZSBpbnB1dCBod19mcmFtZXNfY3R4CisgICAgaWYgKCFpbmwtPmh3X2ZyYW1lc19jdHgpIHsK KyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gaHdfZnJhbWVzX2N0eCBhdmFp bGFibGUgb24gaW5wdXQgbGlua1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7 CisgICAgfQorCisgICAgLy8vPCBQcm9wYWdhdGUgaHdfZnJhbWVzX2N0eCB0byBvdXRwdXQKKyAg ICBvdXRsLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihpbmwtPmh3X2ZyYW1lc19jdHgp OworICAgIGlmICghb3V0bC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9sb2coY3R4LCBB Vl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcHJvcGFnYXRlIGh3X2ZyYW1lc19jdHggdG8gb3V0cHV0 XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAvLy88 IEluaXRpYWxpemUgZmlsdGVyJ3MgaGFyZHdhcmUgZGV2aWNlIGNvbnRleHQKKyAgICBpZiAoIXMt Pmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmluX2ZyYW1lc19j dHggPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilpbmwtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAg ICAgIHMtPmh3X2RldmljZV9jdHggPSBhdl9idWZmZXJfcmVmKGluX2ZyYW1lc19jdHgtPmRldmlj ZV9yZWYpOworICAgICAgICBpZiAoIXMtPmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgICAgIGF2 X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGZpbHRlciBoYXJk d2FyZSBkZXZpY2UgY29udGV4dFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9N RU0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vPCBHZXQgRDNEMTEgZGV2aWNlIGFuZCBj b250ZXh0IChidXQgZG9uJ3QgaW5pdGlhbGl6ZSBwcm9jZXNzb3IgeWV0IC0gZG9uZSBpbiBmaWx0 ZXJfZnJhbWUpCisgICAgQVZIV0RldmljZUNvbnRleHQgKmh3Y3R4ID0gKEFWSFdEZXZpY2VDb250 ZXh0ICopcy0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0 ICpkM2QxMV9od2N0eCA9IChBVkQzRDExVkFEZXZpY2VDb250ZXh0ICopaHdjdHgtPmh3Y3R4Owor CisgICAgcy0+ZGV2aWNlID0gZDNkMTFfaHdjdHgtPmRldmljZTsKKyAgICBzLT5jb250ZXh0ID0g ZDNkMTFfaHdjdHgtPmRldmljZV9jb250ZXh0OworCisgICAgaWYgKCFzLT5kZXZpY2UgfHwgIXMt PmNvbnRleHQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRv IGdldCB2YWxpZCBEM0QxMSBkZXZpY2Ugb3IgY29udGV4dFxuIik7CisgICAgICAgIHJldHVybiBB VkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8vPCBDcmVhdGUgbmV3IGhhcmR3YXJlIGZy YW1lcyBjb250ZXh0IGZvciBvdXRwdXQKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5fZnJhbWVz X2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCAqKWlubC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAg ICBzLT5od19mcmFtZXNfY3R4X291dCA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKHMtPmh3X2Rldmlj ZV9jdHgpOworICAgIGlmICghcy0+aHdfZnJhbWVzX2N0eF9vdXQpCisgICAgICAgIHJldHVybiBB VkVSUk9SKEVOT01FTSk7CisKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzX2N0eCA9IChB VkhXRnJhbWVzQ29udGV4dCAqKXMtPmh3X2ZyYW1lc19jdHhfb3V0LT5kYXRhOworICAgIGZyYW1l c19jdHgtPmZvcm1hdCA9IEFWX1BJWF9GTVRfRDNEMTE7CisgICAgZnJhbWVzX2N0eC0+c3dfZm9y bWF0ID0gcy0+Zm9ybWF0OworICAgIGZyYW1lc19jdHgtPndpZHRoID0gcy0+d2lkdGg7CisgICAg ZnJhbWVzX2N0eC0+aGVpZ2h0ID0gcy0+aGVpZ2h0OworICAgIGZyYW1lc19jdHgtPmluaXRpYWxf cG9vbF9zaXplID0gMTA7CisKKyAgICBpZiAoY3R4LT5leHRyYV9od19mcmFtZXMgPiAwKQorICAg ICAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSArPSBjdHgtPmV4dHJhX2h3X2ZyYW1l czsKKworICAgIEFWRDNEMTFWQUZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19j dHgtPmh3Y3R4OworICAgIGZyYW1lc19od2N0eC0+TWlzY0ZsYWdzID0gMDsKKyAgICBmcmFtZXNf aHdjdHgtPkJpbmRGbGFncyA9IEQzRDExX0JJTkRfUkVOREVSX1RBUkdFVCB8IEQzRDExX0JJTkRf VklERU9fRU5DT0RFUjsKKworICAgIHJldCA9IGF2X2h3ZnJhbWVfY3R4X2luaXQocy0+aHdfZnJh bWVzX2N0eF9vdXQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJl Zigmcy0+aHdfZnJhbWVzX2N0eF9vdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwor ICAgIG91dGwtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHMtPmh3X2ZyYW1lc19jdHhf b3V0KTsKKyAgICBpZiAoIW91dGwtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVS Uk9SKEVOT01FTSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkQzRDExIHNj YWxlIGNvbmZpZzogJWR4JWQgLT4gJWR4JWRcbiIsCisgICAgICAgICAgIGlubGluay0+dywgaW5s aW5rLT5oLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICByZXR1cm4gMDsKK30KKworc3Rh dGljIGF2X2NvbGQgdm9pZCBzY2FsZV9kM2QxMV91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgp IHsKKyAgICBTY2FsZUQzRDExQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIC8vLzwgUmVs ZWFzZSBEM0QxMSByZXNvdXJjZXMKKyAgICByZWxlYXNlX2QzZDExX3Jlc291cmNlcyhzKTsKKwor ICAgIC8vLzwgRnJlZSB0aGUgaGFyZHdhcmUgZGV2aWNlIGNvbnRleHQgcmVmZXJlbmNlCisgICAg YXZfYnVmZmVyX3VucmVmKCZzLT5od19mcmFtZXNfY3R4X291dCk7CisgICAgYXZfYnVmZmVyX3Vu cmVmKCZzLT5od19kZXZpY2VfY3R4KTsKKworICAgIC8vLzwgRnJlZSBvcHRpb24gc3RyaW5ncwor ICAgIGF2X2ZyZWVwKCZzLT53X2V4cHIpOworICAgIGF2X2ZyZWVwKCZzLT5oX2V4cHIpOworfQor CitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2NhbGVfZDNkMTFfaW5wdXRzW10gPSB7CisgICAg eworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAg ICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gc2NhbGVf ZDNkMTFfZmlsdGVyX2ZyYW1lLAorICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQ YWQgc2NhbGVfZDNkMTFfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAg ICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURF TywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IHNjYWxlX2QzZDExX2NvbmZpZ19wcm9wcywKKyAg ICB9LAorfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2NhbGVEM0QxMUNvbnRleHQs IHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRf RkxBR19WSURFT19QQVJBTSkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNjYWxlX2QzZDExX29w dGlvbnNbXSA9IHsKKyAgICB7ICJ3aWR0aCIsICAiT3V0cHV0IHZpZGVvIHdpZHRoIiwgIE9GRlNF VCh3X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIml3In0sIC5mbGFncyA9IEZM QUdTIH0sCisgICAgeyAiaGVpZ2h0IiwgIk91dHB1dCB2aWRlbyBoZWlnaHQiLCBPRkZTRVQoaF9l eHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpaCJ9LCAuZmxhZ3MgPSBGTEFHUyB9 LAorICAgIHsgImZvcm1hdCIsICJPdXRwdXQgdmlkZW8gcGl4ZWwgZm9ybWF0IiwgT0ZGU0VUKGZv cm1hdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgeyAuaTY0ID0gQVZfUElYX0ZNVF9OT05FIH0s IElOVF9NSU4sIElOVF9NQVgsIC5mbGFncz1GTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitB VkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2NhbGVfZDNkMTEpOworCitjb25zdCBGRkZpbHRlciBmZl92 Zl9zY2FsZV9kM2QxMSA9IHsKKyAgICAucC5uYW1lICAgICAgICAgICA9ICJzY2FsZV9kM2QxMSIs CisgICAgLnAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NhbGUgdmlk ZW8gdXNpbmcgRGlyZWN0M0QxMSIpLAorICAgIC5wcml2X3NpemUgICAgICAgID0gc2l6ZW9mKFNj YWxlRDNEMTFDb250ZXh0KSwKKyAgICAucC5wcml2X2NsYXNzICAgICA9ICZzY2FsZV9kM2QxMV9j bGFzcywKKyAgICAuaW5pdCAgICAgICAgICAgICA9IHNjYWxlX2QzZDExX2luaXQsCisgICAgLnVu aW5pdCAgICAgICAgICAgPSBzY2FsZV9kM2QxMV91bmluaXQsCisgICAgRklMVEVSX0lOUFVUUyhz Y2FsZV9kM2QxMV9pbnB1dHMpLAorICAgIEZJTFRFUl9PVVRQVVRTKHNjYWxlX2QzZDExX291dHB1 dHMpLAorICAgIEZJTFRFUl9TSU5HTEVfUElYRk1UKEFWX1BJWF9GTVRfRDNEMTEpLAorICAgIC5w LmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19IV0RFVklDRSwKKyAgICAuZmxhZ3NfaW50 ZXJuYWwgICA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OwpcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5j IGIvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmMKaW5kZXggMWEwNDdjZTU3Yi4uYTU5NDdl MTYxOCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmMKKysrIGIvbGli YXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJ0 aHJlYWQuaCIKICNpbmNsdWRlICJjb21wYXQvdzMyZGxmY24uaCIKIAorI2RlZmluZSBNQVhfQVJS QVlfU0laRSA2NCAvLyBEcml2ZXIgc3BlY2lmaWNhdGlvbiBsaW1pdHMgQXJyYXlTaXplIHRvIDY0 IGZvciBkZWNvZGVyLWJvdW5kIHJlc291cmNlcworCiB0eXBlZGVmIEhSRVNVTFQoV0lOQVBJICpQ Rk5fQ1JFQVRFX0RYR0lfRkFDVE9SWSkoUkVGSUlEIHJpaWQsIHZvaWQgKipwcEZhY3RvcnkpOwog CiBzdGF0aWMgQVZPbmNlIGZ1bmN0aW9uc19sb2FkZWQgPSBBVl9PTkNFX0lOSVQ7CkBAIC0yODgs NiArMjkwLDggQEAgc3RhdGljIGludCBkM2QxMXZhX2ZyYW1lc19pbml0KEFWSFdGcmFtZXNDb250 ZXh0ICpjdHgpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCisgICAg Y3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IEZGTUlOKGN0eC0+aW5pdGlhbF9wb29sX3NpemUsIE1B WF9BUlJBWV9TSVpFKTsKKwogICAgIHRleERlc2MgPSAoRDNEMTFfVEVYVFVSRTJEX0RFU0Mpewog ICAgICAgICAuV2lkdGggICAgICA9IGN0eC0+d2lkdGgsCiAgICAgICAgIC5IZWlnaHQgICAgID0g Y3R4LT5oZWlnaHQsCkBAIC0zNDAsMTkgKzM0NCwzMCBAQCBzdGF0aWMgaW50IGQzZDExdmFfZ2V0 X2J1ZmZlcihBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKIHsKICAgICBB VkQzRDExRnJhbWVEZXNjcmlwdG9yICpkZXNjOwogCi0gICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1 ZmZlcl9wb29sX2dldChjdHgtPnBvb2wpOwotICAgIGlmICghZnJhbWUtPmJ1ZlswXSkKLSAgICAg ICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGRlc2MgPSAoQVZEM0QxMUZyYW1lRGVz Y3JpcHRvciAqKWZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgLyoqCisgICAgICogTG9vcCB1bnRp bCBhIGJ1ZmZlciBiZWNvbWVzIGF2YWlsYWJsZSBmcm9tIHRoZSBwb29sLgorICAgICAqIEluIGEg ZnVsbCBoYXJkd2FyZSBwaXBlbGluZSwgYWxsIGJ1ZmZlcnMgbWF5IGJlIHRlbXBvcmFyaWx5IGlu IHVzZSBieQorICAgICAqIG90aGVyIG1vZHVsZXMgKGVuY29kZXIvZmlsdGVyL2RlY29kZXIpLiBS YXRoZXIgdGhhbiBpbW1lZGlhdGVseSBmYWlsaW5nCisgICAgICogd2l0aCBFTk9NRU0sIHdlIHdh aXQgZm9yIGEgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wsIHdoaWNoCisg ICAgICogbWFpbnRhaW5zIHBpcGVsaW5lIGZsb3cgYW5kIHByZXZlbnRzIHVubmVjZXNzYXJ5IGFs bG9jYXRpb24gZmFpbHVyZXMKKyAgICAgKiBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbi4KKyAgICAg Ki8KKyAgICBkbyB7CisgICAgICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQo Y3R4LT5wb29sKTsKKyAgICAgICAgaWYgKGZyYW1lLT5idWZbMF0pIHsKKyAgICAgICAgICAgIGRl c2MgPSAoQVZEM0QxMUZyYW1lRGVzY3JpcHRvciAqKWZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAg ICAgICAgICBmcmFtZS0+ZGF0YVswXSA9ICh1aW50OF90ICopZGVzYy0+dGV4dHVyZTsKKyAgICAg ICAgICAgIGZyYW1lLT5kYXRhWzFdID0gKHVpbnQ4X3QgKilkZXNjLT5pbmRleDsKKyAgICAgICAg ICAgIGZyYW1lLT5mb3JtYXQgID0gQVZfUElYX0ZNVF9EM0QxMTsKKyAgICAgICAgICAgIGZyYW1l LT53aWR0aCAgID0gY3R4LT53aWR0aDsKKyAgICAgICAgICAgIGZyYW1lLT5oZWlnaHQgID0gY3R4 LT5oZWlnaHQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCi0gICAgZnJhbWUt PmRhdGFbMF0gPSAodWludDhfdCAqKWRlc2MtPnRleHR1cmU7Ci0gICAgZnJhbWUtPmRhdGFbMV0g PSAodWludDhfdCAqKWRlc2MtPmluZGV4OwotICAgIGZyYW1lLT5mb3JtYXQgID0gQVZfUElYX0ZN VF9EM0QxMTsKLSAgICBmcmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7Ci0gICAgZnJhbWUtPmhl aWdodCAgPSBjdHgtPmhlaWdodDsKKyAgICAgICAgYXZfdXNsZWVwKDUwMCk7CisgICAgfSB3aGls ZSAoMSk7CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogfQog CiBzdGF0aWMgaW50IGQzZDExdmFfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMoQVZIV0ZyYW1lc0NvbnRl eHQgKmN0eCwKLS0gCjIuMzQuMQoK --_002_PN0P287MB149478F5A456E224B1163A11E157APN0P287MB1494INDP_ 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_PN0P287MB149478F5A456E224B1163A11E157APN0P287MB1494INDP_--