Explorar o código

obs-ffmpeg: Don't load AMF DLL before amf-test

In the event that simply loading the AMF DLL causes initialization code
to run that might crash, don't load the DLL before the AMF test process
has succeeded. Instead, we load the DLL as data to see if it exists,
then run the AMF test, then load the DLL for real.
Richard Stanway %!s(int64=3) %!d(string=hai) anos
pai
achega
00408b6b3b
Modificáronse 1 ficheiros con 11 adicións e 2 borrados
  1. 11 2
      plugins/obs-ffmpeg/texture-amf.cpp

+ 11 - 2
plugins/obs-ffmpeg/texture-amf.cpp

@@ -1602,10 +1602,15 @@ static void register_hevc()
 extern "C" void amf_load(void)
 try {
 	AMF_RESULT res;
+	HMODULE amf_module_test;
 
-	amf_module = LoadLibraryW(AMF_DLL_NAME);
-	if (!amf_module)
+	/* Check if the DLL is present before running the more expensive */
+	/* obs-amf-test.exe, but load it as data so it can't crash us    */
+	amf_module_test =
+		LoadLibraryExW(AMF_DLL_NAME, nullptr, LOAD_LIBRARY_AS_DATAFILE);
+	if (!amf_module_test)
 		throw "No AMF library";
+	FreeLibrary(amf_module_test);
 
 	/* ----------------------------------- */
 	/* Check for AVC/HEVC support          */
@@ -1667,6 +1672,10 @@ try {
 	/* ----------------------------------- */
 	/* Init AMF                            */
 
+	amf_module = LoadLibraryW(AMF_DLL_NAME);
+	if (!amf_module)
+		throw "AMF library failed to load";
+
 	AMFInit_Fn init =
 		(AMFInit_Fn)GetProcAddress(amf_module, AMF_INIT_FUNCTION_NAME);
 	if (!init)