mirror of
https://github.com/mpv-player/mpv
synced 2024-10-18 10:25:02 +02:00
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
This commit is contained in:
parent
962a99ead2
commit
c040ef5660
@ -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;
|
||||
|
@ -38,6 +38,7 @@ for DLL to know too much about its environment.
|
||||
#include "wine/debugtools.h"
|
||||
#include "wine/module.h"
|
||||
#include "wine/winuser.h"
|
||||
#include "wine/objbase.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "win32.h"
|
||||
@ -3816,6 +3817,12 @@ static int WINAPI expDuplicateHandle(HANDLE hSourceProcessHandle, // handle to
|
||||
return 1;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI expCoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
|
||||
{
|
||||
dbgprintf("CoInitializeEx(%p, %d) called\n", lpReserved, dwCoInit);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// required by PIM1 codec (used by win98 PCTV Studio capture sw)
|
||||
static HRESULT WINAPI expCoInitialize(
|
||||
LPVOID lpReserved /* [in] pointer to win32 malloc interface
|
||||
@ -3825,7 +3832,26 @@ static HRESULT WINAPI expCoInitialize(
|
||||
/*
|
||||
* Just delegate to the newer method.
|
||||
*/
|
||||
return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED);
|
||||
return expCoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED);
|
||||
}
|
||||
|
||||
static void WINAPI expCoUninitialize(void)
|
||||
{
|
||||
dbgprintf("CoUninitialize() called\n");
|
||||
}
|
||||
|
||||
/* allow static linking */
|
||||
HRESULT WINAPI CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
|
||||
{
|
||||
return expCoInitializeEx(lpReserved, dwCoInit);
|
||||
}
|
||||
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
|
||||
{
|
||||
return expCoInitialize(lpReserved);
|
||||
}
|
||||
void WINAPI CoUninitialize(void)
|
||||
{
|
||||
return expCoUninitialize();
|
||||
}
|
||||
|
||||
static DWORD WINAPI expSetThreadAffinityMask
|
||||
@ -5132,6 +5158,8 @@ struct exports exp_ole32[]={
|
||||
FF(CoCreateFreeThreadedMarshaler,-1)
|
||||
FF(CoCreateInstance, -1)
|
||||
FF(CoInitialize, -1)
|
||||
FF(CoInitializeEx, -1)
|
||||
FF(CoUninitialize, -1)
|
||||
FF(CoTaskMemAlloc, -1)
|
||||
FF(CoTaskMemFree, -1)
|
||||
FF(StringFromGUID2, -1)
|
||||
|
19
loader/wine/objbase.h
Normal file
19
loader/wine/objbase.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef WINE_OBJBASE_H
|
||||
#define WINE_OBJBASE_H
|
||||
|
||||
#ifndef STDCALL
|
||||
#define STDCALL __attribute__((__stdcall__))
|
||||
#endif
|
||||
|
||||
/* from objbase.h needed for ve_vfw.c */
|
||||
typedef enum tagCOINIT {
|
||||
COINIT_APARTMENTTHREADED = 0x2,
|
||||
COINIT_MULTITHREADED = 0x0,
|
||||
COINIT_DISABLE_OLE1DDE = 0x4,
|
||||
COINIT_SPEED_OVER_MEMORY = 0x8
|
||||
} COINIT;
|
||||
|
||||
HRESULT STDCALL CoInitialize(LPVOID pvReserved);
|
||||
HRESULT STDCALL CoInitializeEx(LPVOID pvReserved, DWORD dwCoinit);
|
||||
void STDCALL CoUninitialize(void);
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user