From 5a193a73ec41302171ccf09dc67aa996002a8af7 Mon Sep 17 00:00:00 2001 From: Karl Blomster Date: Mon, 25 May 2009 15:52:42 +0000 Subject: [PATCH] Update FFMS2 providers to initialize COM when running under Windows, as per the new FFMS2 init procedure. Originally committed to SVN as r2986. --- aegisub/src/audio_provider_ffmpegsource.cpp | 15 +++++++++++---- aegisub/src/video_provider_ffmpegsource.cpp | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/aegisub/src/audio_provider_ffmpegsource.cpp b/aegisub/src/audio_provider_ffmpegsource.cpp index 7e11b27a4..e74d50746 100644 --- a/aegisub/src/audio_provider_ffmpegsource.cpp +++ b/aegisub/src/audio_provider_ffmpegsource.cpp @@ -41,15 +41,20 @@ // Headers #include "include/aegisub/aegisub.h" #include "audio_provider_ffmpegsource.h" +#ifdef WIN32 +#include +#endif /////////// // Constructor FFmpegSourceAudioProvider::FFmpegSourceAudioProvider(Aegisub::String filename) { - if (FFMS_Init()) { - FFMS_DeInit(); - throw _T("FFmpegSource audio provider: failed to initialize FFMS2"); +#ifdef WIN32 + if (!SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { + throw _T("FFmpegSource audio provider: COM initialization failure"); } +#endif + FFMS_Init(); MsgSize = sizeof(FFMSErrMsg); MsgString = _T("FFmpegSource audio provider: "); @@ -176,6 +181,9 @@ void FFmpegSourceAudioProvider::LoadAudio(Aegisub::String filename) { // Destructor FFmpegSourceAudioProvider::~FFmpegSourceAudioProvider() { Close(); +#ifdef WIN32 + CoUninitialize(); +#endif } @@ -184,7 +192,6 @@ FFmpegSourceAudioProvider::~FFmpegSourceAudioProvider() { void FFmpegSourceAudioProvider::Close() { FFMS_DestroyAudioSource(AudioSource); AudioSource = NULL; - FFMS_DeInit(); } diff --git a/aegisub/src/video_provider_ffmpegsource.cpp b/aegisub/src/video_provider_ffmpegsource.cpp index c52794e80..3a88f70c9 100644 --- a/aegisub/src/video_provider_ffmpegsource.cpp +++ b/aegisub/src/video_provider_ffmpegsource.cpp @@ -45,16 +45,21 @@ #include "video_context.h" #include "options.h" #include "aegisub_endian.h" +#ifdef WIN32 +#include +#endif /////////////// // Constructor FFmpegSourceVideoProvider::FFmpegSourceVideoProvider(Aegisub::String filename, double fps) { - // initialize ffmpegsource - if (FFMS_Init()) { - FFMS_DeInit(); - throw _T("FFmpegSource video provider: failed to initialize FFMS2"); +#ifdef WIN32 + if (!SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { + throw _T("FFmpegSource video provider: COM initialization failure"); } +#endif + // initialize ffmpegsource + FFMS_Init(); // clean up variables VideoSource = NULL; @@ -78,6 +83,9 @@ FFmpegSourceVideoProvider::FFmpegSourceVideoProvider(Aegisub::String filename, d // Destructor FFmpegSourceVideoProvider::~FFmpegSourceVideoProvider() { Close(); +#ifdef WIN32 + CoUninitialize(); +#endif } /////////////// @@ -205,7 +213,6 @@ void FFmpegSourceVideoProvider::LoadVideo(Aegisub::String filename, double fps) void FFmpegSourceVideoProvider::Close() { FFMS_DestroyVideoSource(VideoSource); VideoSource = NULL; - FFMS_DeInit(); DstFormat = FFMS_GetPixFmt("none"); LastDstFormat = FFMS_GetPixFmt("none");