Mercurial > mplayer.hg
annotate loader/driver.c @ 26110:69790f7caffa
configure: Set CONFIG_ENCODERS=yes in config.mak unconditionally
config.h already had "#define CONFIG_ENCODERS 1" unconditionally, but
the config.mak value depended on whether MEncoder was enabled.
Encoders need to be enabled as some encoder code is used by MPlayer
too. The inconsistent values broke compilation with --disable-mencoder
after libavcodec Makefile made compilation of i386/dsputilenc_mmx.o
depend on the config.mak value.
author | uau |
---|---|
date | Mon, 03 Mar 2008 03:02:36 +0000 |
parents | b70f5ac9c001 |
children | 0fdf04b07ecb |
rev | line source |
---|---|
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
1 /* |
18783 | 2 * Modified for use with MPlayer, detailed changelog at |
3 * http://svn.mplayerhq.hu/mplayer/trunk/ | |
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
4 */ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
5 |
7386 | 6 #include "config.h" |
21261
a2e02e6b6379
Rename config.h --> debug.h and include config.h explicitly.
diego
parents:
18783
diff
changeset
|
7 #include "debug.h" |
7386 | 8 |
1 | 9 #include <stdio.h> |
10 #ifdef HAVE_MALLOC_H | |
11 #include <malloc.h> | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
12 #endif |
1 | 13 #include <stdlib.h> |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
14 #ifdef __FreeBSD__ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
15 #include <sys/time.h> |
1 | 16 #endif |
17 | |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
18 #include "win32.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
19 #include "wine/driver.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
20 #include "wine/pe_image.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
21 #include "wine/winreg.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
22 #include "wine/vfw.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
23 #include "registry.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
24 #ifdef WIN32_LOADER |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
25 #include "ldt_keeper.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
26 #endif |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
27 #include "driver.h" |
9978 | 28 #ifndef __MINGW32__ |
8451 | 29 #include "ext.h" |
9978 | 30 #endif |
1 | 31 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
32 #ifndef WIN32_LOADER |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
33 char* def_path=WIN32_PATH; |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
34 #else |
7386 | 35 extern char* def_path; |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
36 #endif |
1 | 37 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
38 #if 1 |
7386 | 39 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
40 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
41 * STORE_ALL/REST_ALL seems like an attempt to workaround problems due to |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
42 * WINAPI/no-WINAPI bustage. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
43 * |
7386 | 44 * There should be no need for the STORE_ALL/REST_ALL hack once all |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
45 * function definitions agree with their prototypes (WINAPI-wise) and |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
46 * we make sure, that we do not call these functions without a proper |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
47 * prototype in scope. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
48 */ |
7386 | 49 |
50 #define STORE_ALL | |
51 #define REST_ALL | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
52 #else |
7386 | 53 // this asm code is no longer needed |
1 | 54 #define STORE_ALL \ |
7386 | 55 __asm__ __volatile__ ( \ |
1 | 56 "push %%ebx\n\t" \ |
57 "push %%ecx\n\t" \ | |
58 "push %%edx\n\t" \ | |
59 "push %%esi\n\t" \ | |
60 "push %%edi\n\t"::) | |
61 | |
62 #define REST_ALL \ | |
7386 | 63 __asm__ __volatile__ ( \ |
1 | 64 "pop %%edi\n\t" \ |
65 "pop %%esi\n\t" \ | |
66 "pop %%edx\n\t" \ | |
67 "pop %%ecx\n\t" \ | |
68 "pop %%ebx\n\t"::) | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
69 #endif |
1 | 70 |
7386 | 71 static int needs_free=0; |
72 void SetCodecPath(const char* path) | |
73 { | |
74 if(needs_free)free(def_path); | |
75 if(path==0) | |
76 { | |
77 def_path=WIN32_PATH; | |
78 needs_free=0; | |
79 return; | |
80 } | |
81 def_path = (char*) malloc(strlen(path)+1); | |
82 strcpy(def_path, path); | |
83 needs_free=1; | |
84 } | |
1 | 85 |
86 static DWORD dwDrvID = 0; | |
87 | |
7386 | 88 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, |
89 LPARAM lParam1, LPARAM lParam2) | |
1 | 90 { |
91 DRVR* module=(DRVR*)hDriver; | |
92 int result; | |
7386 | 93 #ifndef __svr4__ |
94 char qw[300]; | |
95 #endif | |
96 #ifdef DETAILED_OUT | |
1 | 97 printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2); |
98 #endif | |
7386 | 99 if (!module || !module->hDriverModule || !module->DriverProc) return -1; |
100 #ifndef __svr4__ | |
101 __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw)); | |
102 #endif | |
103 | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
104 #ifdef WIN32_LOADER |
7386 | 105 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
106 #endif |
1 | 107 |
7386 | 108 STORE_ALL; |
109 result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2); | |
110 REST_ALL; | |
111 | |
112 #ifndef __svr4__ | |
113 __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw)); | |
114 #endif | |
115 | |
116 #ifdef DETAILED_OUT | |
117 printf("\t\tResult: %X\n", result); | |
118 #endif | |
119 return result; | |
1 | 120 } |
121 | |
7386 | 122 void DrvClose(HDRVR hDriver) |
1 | 123 { |
7386 | 124 if (hDriver) |
125 { | |
126 DRVR* d = (DRVR*)hDriver; | |
127 if (d->hDriverModule) | |
128 { | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
129 #ifdef WIN32_LOADER |
7386 | 130 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
131 #endif |
7386 | 132 if (d->DriverProc) |
133 { | |
134 SendDriverMessage(hDriver, DRV_CLOSE, 0, 0); | |
135 d->dwDriverID = 0; | |
136 SendDriverMessage(hDriver, DRV_FREE, 0, 0); | |
137 } | |
138 FreeLibrary(d->hDriverModule); | |
139 } | |
140 free(d); | |
1 | 141 } |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
142 #ifdef WIN32_LOADER |
7386 | 143 CodecRelease(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
144 #endif |
1 | 145 } |
146 | |
7386 | 147 //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) |
148 HDRVR DrvOpen(LPARAM lParam2) | |
1 | 149 { |
7386 | 150 NPDRVR hDriver; |
151 char unknown[0x124]; | |
152 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; | |
1 | 153 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
154 #ifdef WIN32_LOADER |
236 | 155 Setup_LDT_Keeper(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
156 #endif |
7386 | 157 printf("Loading codec DLL: '%s'\n",filename); |
236 | 158 |
7386 | 159 hDriver = (NPDRVR) malloc(sizeof(DRVR)); |
160 if (!hDriver) | |
1 | 161 return ((HDRVR) 0); |
7386 | 162 memset((void*)hDriver, 0, sizeof(DRVR)); |
1 | 163 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
164 #ifdef WIN32_LOADER |
7386 | 165 CodecAlloc(); |
166 Setup_FS_Segment(); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
167 #endif |
7386 | 168 |
169 hDriver->hDriverModule = LoadLibraryA(filename); | |
170 if (!hDriver->hDriverModule) | |
171 { | |
172 printf("Can't open library %s\n", filename); | |
173 DrvClose((HDRVR)hDriver); | |
174 return ((HDRVR) 0); | |
1 | 175 } |
176 | |
7386 | 177 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, |
178 "DriverProc"); | |
179 if (!hDriver->DriverProc) | |
1 | 180 { |
7386 | 181 printf("Library %s is not a valid VfW/ACM codec\n", filename); |
182 DrvClose((HDRVR)hDriver); | |
183 return ((HDRVR) 0); | |
1 | 184 } |
185 | |
7386 | 186 TRACE("DriverProc == %X\n", hDriver->DriverProc); |
187 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); | |
188 TRACE("DRV_LOAD Ok!\n"); | |
189 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); | |
190 TRACE("DRV_ENABLE Ok!\n"); | |
191 hDriver->dwDriverID = ++dwDrvID; // generate new id | |
1 | 192 |
7386 | 193 // open driver and remmeber proper DriverID |
194 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); | |
195 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); | |
1 | 196 |
12655 | 197 printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); |
7386 | 198 return (HDRVR)hDriver; |
1 | 199 } |