Closed Chipcraft closed 1 year ago
Note on the issue with missing dynamicRendering, I don't know if this is still the case but a week ago I built the latest libplacebo with the latest ffmpeg from Cyanreg's vulkan branch and it worked (no dynamicRendering error) unlike the latest ffmpeg master (not sure if it would lead to memory leaks after some time, didn't spend longer than a minute). However the performance of shaders with libplacebo was around 3/4 the FPS with libplacebo on the latest ffmpeg master.
There were a few things I changed at once that I might have missed so I don't know if Cyanreg's vulkan branch was actually led to it working.
Thanks for the info, cyanreg's vulkan branch indeed does work, due to it supporting the required features of Vulkan 1.3.
Based on that, I butchered together a patch based on following commits of cyanreg's vulkan repo.
cyanreg/FFmpeg@61f6700fc937fda206b88208cd463154c810c13b cyanreg/FFmpeg@fa610949588d1ac95257b13b8e18a838aebbaf24 cyanreg/FFmpeg@1fb2f06c732101f9c8f88189359c40cff3a166b4 cyanreg/FFmpeg@1f7422ebf37315a0a0a6e3ffa2e657406045072b cyanreg/FFmpeg@b87c607cdb340049a210913d1a2cbb3fb327d717 cyanreg/FFmpeg@62121e5fb7624d8268666db7a063bad2f5e23837 cyanreg/FFmpeg@684ce8c259dba4242a21e5fdbb0d472515810231
With this applied on the current FFMpeg master, everything APPEARS to work fine when used together with the current libplacebo 04b4e919ea494329a1133e1efaa08878e5bd2406 master. The performance in tone mapping (hable) at least is identical to "the last know good config" (i.e., FFMpeg 2dd9b40 + libplacebo cedacbfbc96c2dbc9ccba0cda8b2392d618d1fc0), as it the VRAM usage (~ 2.7GB for 2160p), meaning there is no memory leak.
Obviously this is not a real solution however, it seems to work for now.
diff --git a/configure b/configure
index 87f7afc2e1..201efd4f94 100755
--- a/configure
+++ b/configure
@@ -7040,8 +7040,8 @@ enabled crystalhd && check_lib crystalhd "stdint.h libcrystalhd/libcrystalhd_if.
"in maintaining it."
if enabled vulkan; then
- check_pkg_config_header_only vulkan "vulkan >= 1.2.189" "vulkan/vulkan.h" "defined VK_VERSION_1_2" ||
- check_cpp_condition vulkan "vulkan/vulkan.h" "defined(VK_VERSION_1_3) || (defined(VK_VERSION_1_2) && VK_HEADER_VERSION >= 189)"
+ check_pkg_config_header_only vulkan "vulkan >= 1.3.238" "vulkan/vulkan.h" "defined VK_VERSION_1_3" ||
+ check_cpp_condition vulkan "vulkan/vulkan.h" "defined(VK_VERSION_1_4) || (defined(VK_VERSION_1_3) && VK_HEADER_VERSION >= 238)"
fi
if enabled x86; then
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index adebcc4541..2508f36cac 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -574,7 +574,7 @@ static int init_vulkan(AVFilterContext *avctx, const AVVulkanDeviceContext *hwct
.count = hwctx->nb_tx_queues,
},
/* This is the highest version created by hwcontext_vulkan.c */
- .max_api_version = VK_API_VERSION_1_2,
+ .max_api_version = VK_API_VERSION_1_3,
));
} else {
s->vulkan = pl_vulkan_create(s->log, pl_vulkan_params(
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index ffd4f5dec4..65e1d9eb10 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -89,6 +89,8 @@ typedef struct VulkanDevicePriv {
/* Features */
VkPhysicalDeviceVulkan11Features device_features_1_1;
VkPhysicalDeviceVulkan12Features device_features_1_2;
+ VkPhysicalDeviceVulkan13Features device_features_1_3;
+ VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features;
/* Queues */
uint32_t qfs[5];
@@ -339,14 +341,16 @@ typedef struct VulkanOptExtension {
} VulkanOptExtension;
static const VulkanOptExtension optional_instance_exts[] = {
- /* For future use */
+ /* Pointless, here avoid zero-sized structs */
+ { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
};
static const VulkanOptExtension optional_device_exts[] = {
/* Misc or required by other extensions */
+ { VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
{ VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
- { VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
+ { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
/* Imports/exports */
{ VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_FD_MEMORY },
@@ -673,7 +677,7 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
VkApplicationInfo application_info = {
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pEngineName = "libavutil",
- .apiVersion = VK_API_VERSION_1_2,
+ .apiVersion = VK_API_VERSION_1_3,
.engineVersion = VK_MAKE_VERSION(LIBAVUTIL_VERSION_MAJOR,
LIBAVUTIL_VERSION_MINOR,
LIBAVUTIL_VERSION_MICRO),
@@ -1326,9 +1330,17 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
};
+ VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features = {
+ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
+ .pNext = &timeline_features,
+ };
+ VkPhysicalDeviceVulkan13Features dev_features_1_3 = {
+ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
+ .pNext = &desc_buf_features,
+ };
VkPhysicalDeviceVulkan12Features dev_features_1_2 = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
- .pNext = &timeline_features,
+ .pNext = &dev_features_1_3,
};
VkPhysicalDeviceVulkan11Features dev_features_1_1 = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
@@ -1341,14 +1353,17 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
VkDeviceCreateInfo dev_info = {
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
- .pNext = &hwctx->device_features,
- };
+ };
hwctx->device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
hwctx->device_features.pNext = &p->device_features_1_1;
p->device_features_1_1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
p->device_features_1_1.pNext = &p->device_features_1_2;
p->device_features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+ p->device_features_1_2.pNext = &p->device_features_1_3;
+ p->device_features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
+ p->device_features_1_3.pNext = &p->desc_buf_features;
+ p->desc_buf_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT;
ctx->free = vulkan_device_free;
/* Create an instance if not given one */
@@ -1369,6 +1384,8 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
COPY_FEATURE(hwctx->device_features, fragmentStoresAndAtomics)
COPY_FEATURE(hwctx->device_features, vertexPipelineStoresAndAtomics)
COPY_FEATURE(hwctx->device_features, shaderInt64)
+ COPY_FEATURE(hwctx->device_features, shaderInt16)
+ COPY_FEATURE(hwctx->device_features, shaderFloat64)
#undef COPY_FEATURE
/* We require timeline semaphores */
@@ -1377,7 +1394,35 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
err = AVERROR(ENOSYS);
goto end;
}
+
+ p->device_features_1_1.samplerYcbcrConversion = dev_features_1_1.samplerYcbcrConversion;
+ p->device_features_1_1.storagePushConstant16 = dev_features_1_1.storagePushConstant16;
+
p->device_features_1_2.timelineSemaphore = 1;
+ p->device_features_1_2.bufferDeviceAddress = dev_features_1_2.bufferDeviceAddress;
+ p->device_features_1_2.hostQueryReset = dev_features_1_2.hostQueryReset;
+ p->device_features_1_2.storagePushConstant8 = dev_features_1_2.storagePushConstant8;
+ p->device_features_1_2.shaderInt8 = dev_features_1_2.shaderInt8;
+ p->device_features_1_2.storageBuffer8BitAccess = dev_features_1_2.storageBuffer8BitAccess;
+ p->device_features_1_2.uniformAndStorageBuffer8BitAccess = dev_features_1_2.uniformAndStorageBuffer8BitAccess;
+ p->device_features_1_2.shaderFloat16 = dev_features_1_2.shaderFloat16;
+ p->device_features_1_2.shaderSharedInt64Atomics = dev_features_1_2.shaderSharedInt64Atomics;
+ p->device_features_1_2.vulkanMemoryModel = dev_features_1_2.vulkanMemoryModel;
+ p->device_features_1_2.vulkanMemoryModelDeviceScope = dev_features_1_2.vulkanMemoryModelDeviceScope;
+ p->device_features_1_2.hostQueryReset = dev_features_1_2.hostQueryReset;
+
+ p->device_features_1_3.dynamicRendering = dev_features_1_3.dynamicRendering;
+ p->device_features_1_3.maintenance4 = dev_features_1_3.maintenance4;
+ p->device_features_1_3.synchronization2 = dev_features_1_3.synchronization2;
+ p->device_features_1_3.computeFullSubgroups = dev_features_1_3.computeFullSubgroups;
+ p->device_features_1_3.shaderZeroInitializeWorkgroupMemory = dev_features_1_3.shaderZeroInitializeWorkgroupMemory;
+ p->device_features_1_3.dynamicRendering = dev_features_1_3.dynamicRendering;
+
+ p->desc_buf_features.descriptorBuffer = desc_buf_features.descriptorBuffer;
+ p->desc_buf_features.descriptorBufferPushDescriptors = desc_buf_features.descriptorBufferPushDescriptors;
+
+
+ dev_info.pNext = &hwctx->device_features;
/* Setup queue family */
if ((err = setup_queue_families(ctx, &dev_info)))
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
index df86c85b3c..70c8379dc3 100644
--- a/libavutil/hwcontext_vulkan.h
+++ b/libavutil/hwcontext_vulkan.h
@@ -53,7 +53,7 @@ typedef struct AVVulkanDeviceContext {
PFN_vkGetInstanceProcAddr get_proc_addr;
/**
- * Vulkan instance. Must be at least version 1.2.
+ * Vulkan instance. Must be at least version 1.3.
*/
VkInstance inst;
diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h
index d15a5d9a42..9e7a2ddd2b 100644
--- a/libavutil/vulkan_functions.h
+++ b/libavutil/vulkan_functions.h
@@ -37,6 +37,7 @@ typedef enum FFVulkanExtensions {
FF_VK_EXT_EXTERNAL_WIN32_MEMORY = 1ULL << 6, /* VK_KHR_external_memory_win32 */
FF_VK_EXT_EXTERNAL_WIN32_SEM = 1ULL << 7, /* VK_KHR_external_semaphore_win32 */
#endif
+ FF_VK_EXT_DESCRIPTOR_BUFFER = 1ULL << 8, /* VK_EXT_descriptor_buffer */
FF_VK_EXT_NO_FLAG = 1ULL << 31,
} FFVulkanExtensions;
@@ -120,6 +121,7 @@ typedef enum FFVulkanExtensions {
MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferMemoryRequirements2) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateBuffer) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindBufferMemory) \
+ MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferDeviceAddress) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyBuffer) \
\
/* Image */ \
@@ -140,11 +142,21 @@ typedef enum FFVulkanExtensions {
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorPool) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorPool) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorSetLayout) \
+ \
+ /* Descriptor buffers */ \
+ MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutSizeEXT) \
+ MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutBindingOffsetEXT) \
+ MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorEXT) \
+ MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdBindDescriptorBuffersEXT) \
+ MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdSetDescriptorBufferOffsetsEXT) \
\
/* DescriptorUpdateTemplate */ \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorUpdateTemplate) \
+ \
+ /* sync2 */ \
+ MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier2) \
\
/* Pipeline */ \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \
@@ -155,6 +167,8 @@ typedef enum FFVulkanExtensions {
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipeline) \
\
/* Sampler */ \
+ MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSamplerYcbcrConversion) \
+ MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySamplerYcbcrConversion) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSampler) \
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySampler) \
\
diff --git a/libavutil/vulkan_loader.h b/libavutil/vulkan_loader.h
index 3f1ee6aa46..2a1d42cddd 100644
--- a/libavutil/vulkan_loader.h
+++ b/libavutil/vulkan_loader.h
@@ -48,6 +48,7 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
{ VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_MEMORY },
{ VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_SEM },
#endif
+ { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
};
FFVulkanExtensions mask = 0x0;
Did some testing and apparently at least Intel Gen. 11 (Jasper Lake GT-1 32EU) w/ IGD 31.0.101.2121 WHQL) crap in the bed driver wise, since all of the functions fail. Not a real surprise I assume, considering the general state of the drivers. Intel does not support Vulkan 1.1 "samplerYcbcrConversion" -feature or Vulkan 1.2 "shaderSharedInt64Atomics" -feature, which separates it from AMD and NVIDIA however, I wouldn't expect that to be the reason.
libplacebo tests pass without issues, as long as the timeout is increased or disabled (meson test --timeout-multiplier=0 or xx) as this is a SLOW system.
[libplacebo @ 000002234ad59bc0] Validation failed: !params->renderable || fmt_caps & PL_FMT_CAP_RENDERABLE (../src/gpu.c:234)
[libplacebo @ 000002234ad59bc0] Backtrace:
[libplacebo @ 000002234ad59bc0] #0 0x7ffdf364b1bd in pl_tex_create+0x3cd (C:\Users\Username\Desktop\FFTest\libplacebo-278.dll+0x2b1bd) (0x1e226b1bd)
[libplacebo @ 000002234ad59bc0] #1 0x7ffdf364b8c0 in pl_tex_recreate+0x200 (C:\Users\Username\Desktop\FFTest\libplacebo-278.dll+0x2b8c0) (0x1e226b8c0)
[libplacebo @ 000002234ad59bc0] #2 0x7ffdf368b151 in pl_recreate_plane+0xa1 (C:\Users\Username\Desktop\FFTest\libplacebo-278.dll+0x6b151) (0x1e22ab151)
[libplacebo @ 000002234ad59bc0] #3 0x7ff6508b5aa4 (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x135aa4) (0x140135aa4)
[libplacebo @ 000002234ad59bc0] #4 0x7ff6508b5e5a (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x135e5a) (0x140135e5a)
[libplacebo @ 000002234ad59bc0] #5 0x7ff6507da6a9 (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x5a6a9) (0x14005a6a9)
[libplacebo @ 000002234ad59bc0] #6 0x7ff6507decdf (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x5ecdf) (0x14005ecdf)
[libplacebo @ 000002234ad59bc0] #7 0x7ff650791317 (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x11317) (0x140011317)
[libplacebo @ 000002234ad59bc0] #8 0x7ff650781bbf (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x1bbf) (0x140001bbf)
[libplacebo @ 000002234ad59bc0] #9 0x7ff65171e5ab (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0xf9e5ab) (0x140f9e5ab)
[libplacebo @ 000002234ad59bc0] #10 0x7ff6507812ed (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x12ed) (0x1400012ed)
[libplacebo @ 000002234ad59bc0] #11 0x7ff650781405 (C:\Users\Username\Desktop\FFTest\ffmpeg.exe+0x1405) (0x140001405)
[libplacebo @ 000002234ad59bc0] #12 0x7ffe1b707613 in BaseThreadInitThunk+0x13 (C:\Windows\System32\KERNEL32.DLL+0x17613) (0x180017613)
[libplacebo @ 000002234ad59bc0] #13 0x7ffe1cd626a0 in RtlUserThreadStart+0x20 (C:\Windows\SYSTEM32\ntdll.dll+0x526a0) (0x1800526a0)
[libplacebo @ 000002234ad59bc0] for texture: ../src/utils/upload.c:356
[libplacebo @ 000002234ad59bc0] Failed initializing plane texture!
Error while filtering: Generic error in an external library
Failed to inject frame into filter network: Generic error in an external library
Conversion failed!
Meanwhile following GPUs do work:
Solved by FFMpeg master baa9fccf8d72be259024d7e0eb919c909714c6a7 & libplacebo e68461922179f33255e30068fa8e5fca622861a3.
Will create a separate issue for the Intel GPU issue.
As requested by kasper93, here is a follow-up (https://github.com/haasn/libplacebo/issues/170) on the current FFMpeg - libplacebo issues.
First of all, the issues are hardware agnostic.
Vulkan Hardware Capability Viewer 3.30 (Features > Core 1.3)
AMD: dynamicRendering = True Intel: dynamicRendering = True NVIDIA: dynamicRendering = True
///////////////////////////////////////////
So, the situation with the current FFMpeg master e8e486332571347dd55822c842ba67276ac308e2 with libplacebo master 20d63f7335174cb54eb3582f406b4843771760e6:
Libplacebo:
1) meson setup --prefix=/home/Username/ExtLibs --buildtype=release -Dtests=true --default-library=shared BuildFolder 2) ninja -C BuildFolder install 3) ninja -C BuildFolder test
FFMpeg:
1) PKG_CONFIG_PATH=/home/Username/ExtLibs/lib/pkgconfig ./configure --enable-nvenc --enable-libplacebo --extra-libs="-lstdc++" 2) make -j 64 3) ffmpeg -i Input.mkv -init_hw_device vulkan -vf libplacebo=downscaler=lanczos:w=iw/2:h=ih/2 -frames:v 1 -update 1 Output.png
With libplacebo at > cedacbfbc96c2dbc9ccba0cda8b2392d618d1fc0 && <= fd20dba8435a0d16430bf90d45be3a43aaae1a01 the emitted error is:
And the current error is introduced with the libplacebo at >= 9f35ff1ad6a95245659a0935d7a20a3543814838 && == 20d63f7335174cb54eb3582f406b4843771760e6 (master).
The error is the same, regardless of the functionality to be used (e.g., downscaler, upscaler, tonemapping, etc.).
Based on testing, cedacbfbc96c2dbc9ccba0cda8b2392d618d1fc0 is the last commit, which works without Vulkan 1.3 being available, despite commit comments of 1e0b01ea4ad9b0010a3389c2d2894244956b854e do state that the requirement for Vulkan 1.3 has been reverted. Apparently, the actual issue is that even the current master of FFMpeg is limited to Vulkan 1.2 https://github.com/haasn/libplacebo/commit/cfd87b21f18e52729296f866369ead486f1ce10f#commitcomment-110290665. That being said, I haven't been able to find any patches for FFMpeg which would get rid of this limitation.
cedacbfbc96c2dbc9ccba0cda8b2392d618d1fc0 can be used with the current FFMpeg master e8e486332571347dd55822c842ba67276ac308e2 however, that seems to result in a memory leak. Functions like downscaler / upscaler will generally work however, tone mapping for example will fail as soon as it runs out of memory. Also, all of GPUs dedicated VRAM is allocated from the get-go, while normally the allocation is couple of GBs.
For example on the 4070 Ti, with 12GB of VRAM, tone mapping function (-init_hw_device vulkan -vf libplacebo=colorspace=bt709:color_primaries=bt709:color_trc=bt709:tonemapping=hable), after couple of minutes of running:
So, as far as I am able to determine, the conclusion made in https://github.com/haasn/libplacebo/issues/170 still stands: The most recent version of libplacebo and FFMpeg that work correctly together are: cedacbfbc96c2dbc9ccba0cda8b2392d618d1fc0 and FFMpeg - 2dd9b4071cebd25af2820f26c5bc0a92ef0145fe.