summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorcompn <compn@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-10-17 05:14:21 +0000
committercompn <compn@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-10-17 05:14:21 +0000
commitc040ef56602394c6f11e9f6d9d810ab4874af584 (patch)
tree2c442a29b8de8f26bc451c9148dbe5968717d303 /libmpcodecs
parent962a99ead20966b1d045271da746492ad1ceb25f (diff)
downloadmpv-c040ef56602394c6f11e9f6d9d810ab4874af584.tar.bz2
mpv-c040ef56602394c6f11e9f6d9d810ab4874af584.tar.xz
Add Coinitialize function to vfw encoder and win32 loader.
Fixes crash when trying to load vp7vfw.dll in vfw2menc. Patch by Gianluigi Tiesi mplayer___netfarm.it http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2007-September/054136.html git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24798 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ve_vfw.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/libmpcodecs/ve_vfw.c b/libmpcodecs/ve_vfw.c
index a59ab41504..2b54fbaedd 100644
--- a/libmpcodecs/ve_vfw.c
+++ b/libmpcodecs/ve_vfw.c
@@ -19,6 +19,8 @@
//#include "loader/wine/mmreg.h"
#include "loader/wine/vfw.h"
#include "loader/wine/avifmt.h"
+#include "loader/wine/winerror.h"
+#include "loader/wine/objbase.h"
#include "img_format.h"
#include "mp_image.h"
@@ -31,6 +33,7 @@
static char *vfw_param_codec = NULL;
static char *vfw_param_compdata = NULL;
+static HRESULT CoInitRes = -1;
#include "m_option.h"
@@ -63,7 +66,7 @@ static BITMAPINFOHEADER* vfw_open_encoder(char *dll_name, char *compdatafile, BI
//sh_video = malloc(sizeof(sh_video_t));
mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (VFW) VIDEO Encoder init =======\n");
-
+ CoInitRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// memset(&sh_video->o_bih, 0, sizeof(BITMAPINFOHEADER));
// output_bih->biSize = sizeof(BITMAPINFOHEADER);
@@ -295,6 +298,24 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
return 1;
}
+static void uninit(struct vf_instance_s* vf)
+{
+ HRESULT ret;
+
+ if(encoder_hic){
+ if(encoder_buf){
+ ret=ICCompressEnd(encoder_hic);
+ if(ret) mp_msg(MSGT_WIN32, MSGL_WARN, "ICCompressEnd failed: %ld\n", ret);
+ free(encoder_buf);
+ encoder_buf=NULL;
+ }
+ ret=ICClose(encoder_hic);
+ if(ret) mp_msg(MSGT_WIN32, MSGL_WARN, "ICClose failed: %ld\n", ret);
+ encoder_hic=0;
+ if ((CoInitRes == S_OK) || (CoInitRes == S_FALSE)) CoUninitialize();
+ }
+}
+
//===========================================================================//
static int vf_open(vf_instance_t *vf, char* args){
@@ -303,6 +324,7 @@ static int vf_open(vf_instance_t *vf, char* args){
vf->control=control;
vf->query_format=query_format;
vf->put_image=put_image;
+ vf->uninit=uninit;
vf->priv=malloc(sizeof(struct vf_priv_s));
memset(vf->priv,0,sizeof(struct vf_priv_s));
vf->priv->mux=(muxer_stream_t*)args;