Mercurial > mplayer.hg
annotate loader/driver.c @ 25063:29260745e4fa
Pass all available formats to chain building routine and
establish connection with first of available formats.
This will make further format negotiation patch slightly
simpler.
To avoid pins connection error due to unsuported format
at top of the list, put requested video format to the
top of list. This will also useful with upcoming patch -
negotiation will be started from requested format.
author | voroshil |
---|---|
date | Sun, 18 Nov 2007 10:51:22 +0000 |
parents | 4f489e54b7c9 |
children | b70f5ac9c001 |
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 * $Id$ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
5 */ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
6 |
7386 | 7 #include "config.h" |
21261
a2e02e6b6379
Rename config.h --> debug.h and include config.h explicitly.
diego
parents:
18783
diff
changeset
|
8 #include "debug.h" |
7386 | 9 |
1 | 10 #include <stdio.h> |
11 #ifdef HAVE_MALLOC_H | |
12 #include <malloc.h> | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
13 #endif |
1 | 14 #include <stdlib.h> |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
15 #ifdef __FreeBSD__ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
16 #include <sys/time.h> |
1 | 17 #endif |
18 | |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
19 #include "win32.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
20 #include "wine/driver.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
21 #include "wine/pe_image.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
22 #include "wine/winreg.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
23 #include "wine/vfw.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
24 #include "registry.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
25 #ifdef WIN32_LOADER |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
26 #include "ldt_keeper.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
27 #endif |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
28 #include "driver.h" |
9978 | 29 #ifndef __MINGW32__ |
8451 | 30 #include "ext.h" |
9978 | 31 #endif |
1 | 32 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
33 #ifndef WIN32_LOADER |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
34 char* def_path=WIN32_PATH; |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
35 #else |
7386 | 36 extern char* def_path; |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
37 #endif |
1 | 38 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
39 #if 1 |
7386 | 40 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
41 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
42 * 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
|
43 * WINAPI/no-WINAPI bustage. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
44 * |
7386 | 45 * 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
|
46 * 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
|
47 * 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
|
48 * prototype in scope. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
49 */ |
7386 | 50 |
51 #define STORE_ALL | |
52 #define REST_ALL | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
53 #else |
7386 | 54 // this asm code is no longer needed |
1 | 55 #define STORE_ALL \ |
7386 | 56 __asm__ __volatile__ ( \ |
1 | 57 "push %%ebx\n\t" \ |
58 "push %%ecx\n\t" \ | |
59 "push %%edx\n\t" \ | |
60 "push %%esi\n\t" \ | |
61 "push %%edi\n\t"::) | |
62 | |
63 #define REST_ALL \ | |
7386 | 64 __asm__ __volatile__ ( \ |
1 | 65 "pop %%edi\n\t" \ |
66 "pop %%esi\n\t" \ | |
67 "pop %%edx\n\t" \ | |
68 "pop %%ecx\n\t" \ | |
69 "pop %%ebx\n\t"::) | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
70 #endif |
1 | 71 |
7386 | 72 static int needs_free=0; |
73 void SetCodecPath(const char* path) | |
74 { | |
75 if(needs_free)free(def_path); | |
76 if(path==0) | |
77 { | |
78 def_path=WIN32_PATH; | |
79 needs_free=0; | |
80 return; | |
81 } | |
82 def_path = (char*) malloc(strlen(path)+1); | |
83 strcpy(def_path, path); | |
84 needs_free=1; | |
85 } | |
1 | 86 |
87 static DWORD dwDrvID = 0; | |
88 | |
7386 | 89 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, |
90 LPARAM lParam1, LPARAM lParam2) | |
1 | 91 { |
92 DRVR* module=(DRVR*)hDriver; | |
93 int result; | |
7386 | 94 #ifndef __svr4__ |
95 char qw[300]; | |
96 #endif | |
97 #ifdef DETAILED_OUT | |
1 | 98 printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2); |
99 #endif | |
7386 | 100 if (!module || !module->hDriverModule || !module->DriverProc) return -1; |
101 #ifndef __svr4__ | |
102 __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw)); | |
103 #endif | |
104 | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
105 #ifdef WIN32_LOADER |
7386 | 106 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
107 #endif |
1 | 108 |
7386 | 109 STORE_ALL; |
110 result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2); | |
111 REST_ALL; | |
112 | |
113 #ifndef __svr4__ | |
114 __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw)); | |
115 #endif | |
116 | |
117 #ifdef DETAILED_OUT | |
118 printf("\t\tResult: %X\n", result); | |
119 #endif | |
120 return result; | |
1 | 121 } |
122 | |
7386 | 123 void DrvClose(HDRVR hDriver) |
1 | 124 { |
7386 | 125 if (hDriver) |
126 { | |
127 DRVR* d = (DRVR*)hDriver; | |
128 if (d->hDriverModule) | |
129 { | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
130 #ifdef WIN32_LOADER |
7386 | 131 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
132 #endif |
7386 | 133 if (d->DriverProc) |
134 { | |
135 SendDriverMessage(hDriver, DRV_CLOSE, 0, 0); | |
136 d->dwDriverID = 0; | |
137 SendDriverMessage(hDriver, DRV_FREE, 0, 0); | |
138 } | |
139 FreeLibrary(d->hDriverModule); | |
140 } | |
141 free(d); | |
1 | 142 } |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
143 #ifdef WIN32_LOADER |
7386 | 144 CodecRelease(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
145 #endif |
1 | 146 } |
147 | |
7386 | 148 //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) |
149 HDRVR DrvOpen(LPARAM lParam2) | |
1 | 150 { |
7386 | 151 NPDRVR hDriver; |
152 char unknown[0x124]; | |
153 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; | |
1 | 154 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
155 #ifdef WIN32_LOADER |
236 | 156 Setup_LDT_Keeper(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
157 #endif |
7386 | 158 printf("Loading codec DLL: '%s'\n",filename); |
236 | 159 |
7386 | 160 hDriver = (NPDRVR) malloc(sizeof(DRVR)); |
161 if (!hDriver) | |
1 | 162 return ((HDRVR) 0); |
7386 | 163 memset((void*)hDriver, 0, sizeof(DRVR)); |
1 | 164 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
165 #ifdef WIN32_LOADER |
7386 | 166 CodecAlloc(); |
167 Setup_FS_Segment(); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
168 #endif |
7386 | 169 |
170 hDriver->hDriverModule = LoadLibraryA(filename); | |
171 if (!hDriver->hDriverModule) | |
172 { | |
173 printf("Can't open library %s\n", filename); | |
174 DrvClose((HDRVR)hDriver); | |
175 return ((HDRVR) 0); | |
1 | 176 } |
177 | |
7386 | 178 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, |
179 "DriverProc"); | |
180 if (!hDriver->DriverProc) | |
1 | 181 { |
7386 | 182 printf("Library %s is not a valid VfW/ACM codec\n", filename); |
183 DrvClose((HDRVR)hDriver); | |
184 return ((HDRVR) 0); | |
1 | 185 } |
186 | |
7386 | 187 TRACE("DriverProc == %X\n", hDriver->DriverProc); |
188 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); | |
189 TRACE("DRV_LOAD Ok!\n"); | |
190 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); | |
191 TRACE("DRV_ENABLE Ok!\n"); | |
192 hDriver->dwDriverID = ++dwDrvID; // generate new id | |
1 | 193 |
7386 | 194 // open driver and remmeber proper DriverID |
195 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); | |
196 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); | |
1 | 197 |
12655 | 198 printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); |
7386 | 199 return (HDRVR)hDriver; |
1 | 200 } |