From 8280dbc596dafffc72fa8866e0705a742786c4a1 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 17 Sep 2015 16:46:17 -0700 Subject: [PATCH] win-mf: Do not register encoder if it can't create It seems that certain encoders (quicksync) do not have proper back-end support in the windows media foundation libraries for certain CPUs. Quicksync doesn't appear to support CPUs that are not haswell (4xxx) or above. It's really annoying, but there's not much we can do about it until we implement our own custom quicksync implementation. This check simply makes it attempt to spawn an encoder to check to see whether the encoder can actually be created before registering an encoder. --- plugins/win-mf/mf-h264.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/win-mf/mf-h264.cpp b/plugins/win-mf/mf-h264.cpp index e26f37c2f..9a17b0469 100644 --- a/plugins/win-mf/mf-h264.cpp +++ b/plugins/win-mf/mf-h264.cpp @@ -504,6 +504,16 @@ static bool MFH264_Update(void *data, obs_data_t *settings) return true; } +static bool CanSpawnEncoder(std::shared_ptr descriptor) +{ + HRESULT hr; + ComPtr transform; + + hr = CoCreateInstance(descriptor->Guid(), nullptr, + CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&transform)); + return hr == S_OK; +} + void RegisterMFH264Encoders() { obs_encoder_info info = { 0 }; @@ -527,6 +537,11 @@ void RegisterMFH264Encoders() if (e->Type() == EncoderType::H264_SOFTWARE) continue; + /* certain encoders such as quicksync will be "available" but + * not usable with certain processors */ + if (!CanSpawnEncoder(e)) + continue; + info.id = e->Id(); info.type_data = new TypeData(e); info.free_type_data = [] (void *type_data) { -- GitLab