Mercurial > mplayer.hg
annotate libmpcodecs/vd_vfwex.c @ 7241:283561e2bef5
better subfont description, moved to the write place
author | jonas |
---|---|
date | Mon, 02 Sep 2002 00:34:20 +0000 |
parents | 08feeb543402 |
children | 5f1f724f7046 |
rev | line source |
---|---|
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
1 #include <stdio.h> |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
2 #include <stdlib.h> |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
3 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
4 #include "config.h" |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
5 #include "mp_msg.h" |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
6 #include "help_mp.h" |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
7 |
7229 | 8 #ifdef USE_WIN32DLL |
9 | |
10 #include "loader.h" | |
11 //#include "wine/mmreg.h" | |
12 #include "wine/vfw.h" | |
13 #include "wine/avifmt.h" | |
14 | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
15 #include "vd_internal.h" |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
16 |
7229 | 17 #include "libvo/img_format.h" |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
18 |
7176 | 19 static vd_info_t info = { |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
20 "Win32/VfWex video codecs", |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
21 "vfwex", |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
22 "A'rpi", |
7229 | 23 "A'rpi & Alex", |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
24 "win32 codecs" |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
25 }; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
26 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
27 LIBVD_EXTERN(vfwex) |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
28 |
7229 | 29 typedef struct { |
30 BITMAPINFOHEADER *o_bih; | |
31 HIC handle; | |
32 } vd_vfw_ctx; | |
33 | |
34 extern int divx_quality; | |
35 | |
36 static int vfw_set_postproc(sh_video_t* sh, int quality) | |
37 { | |
38 vd_vfw_ctx *priv = sh->context; | |
39 // Works only with opendivx/divx4 based DLL | |
40 return ICSendMessage(priv->handle, ICM_USER+80, (long)(&quality) ,NULL); | |
41 } | |
42 | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
43 // to set/get/query special features/parameters |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
44 static int control(sh_video_t *sh,int cmd,void* arg,...){ |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
45 switch(cmd){ |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
46 case VDCTRL_QUERY_MAX_PP_LEVEL: |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
47 return 9; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
48 case VDCTRL_SET_PP_LEVEL: |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
49 vfw_set_postproc(sh,10*(*((int*)arg))); |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
50 return CONTROL_OK; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
51 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
52 return CONTROL_UNKNOWN; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
53 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
54 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
55 // init driver |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
56 static int init(sh_video_t *sh){ |
7229 | 57 HRESULT ret; |
58 int yuv=0; | |
59 unsigned int outfmt=sh->codec->outfmt[sh->outfmtidx]; | |
60 int i, o_bih_len; | |
61 vd_vfw_ctx *priv; | |
62 | |
63 priv = malloc(sizeof(vd_vfw_ctx)); | |
64 if (!priv) | |
65 return 0; | |
66 memset(priv, 0, sizeof(vd_vfw_ctx)); | |
67 sh->context = priv; | |
68 | |
69 mp_msg(MSGT_WIN32,MSGL_V,"======= Win32 (VFW) VIDEO Codec init =======\n"); | |
70 | |
71 win32_codec_name = sh->codec->dll; | |
72 // sh->hic = ICOpen( 0x63646976, sh->bih->biCompression, ICMODE_FASTDECOMPRESS); | |
73 priv->handle = ICOpen( 0x63646976, sh->bih->biCompression, ICMODE_DECOMPRESS); | |
74 if(!priv->handle){ | |
75 mp_msg(MSGT_WIN32,MSGL_ERR,"ICOpen failed! unknown codec / wrong parameters?\n"); | |
76 return 0; | |
77 } | |
78 | |
79 // sh->bih->biBitCount=32; | |
80 | |
81 o_bih_len = ICDecompressGetFormatSize(priv->handle, sh->bih); | |
82 | |
83 priv->o_bih = malloc(o_bih_len); | |
84 memset(priv->o_bih, 0, o_bih_len); | |
85 // priv->o_bih->biSize = o_bih_len; | |
86 | |
87 printf("ICDecompressGetFormatSize ret: %d\n", o_bih_len); | |
88 | |
89 ret = ICDecompressGetFormat(priv->handle, sh->bih, priv->o_bih); | |
90 if(ret < 0){ | |
91 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressGetFormat failed: Error %d\n", (int)ret); | |
92 for (i=0; i < o_bih_len; i++) mp_msg(MSGT_WIN32, MSGL_DBG2, "%02x ", priv->o_bih[i]); | |
93 return 0; | |
94 } | |
95 mp_msg(MSGT_WIN32,MSGL_V,"ICDecompressGetFormat OK\n"); | |
96 | |
97 // QPEG fsck !?! | |
98 // priv->o_bih->biSize = o_bih_len; | |
99 | |
100 // printf("ICM_DECOMPRESS_QUERY=0x%X",ICM_DECOMPRESS_QUERY); | |
101 | |
102 // sh->o_bih.biWidth=sh_video->bih.biWidth; | |
103 // sh->o_bih.biCompression = 0x32315659; // mmioFOURCC('U','Y','V','Y'); | |
104 // ret=ICDecompressGetFormatSize(sh_video->hic,&sh_video->o_bih); | |
105 // sh->o_bih.biCompression = 3; //0x32315659; | |
106 // sh->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
107 // sh->o_bih.biCompression = mmioFOURCC('U','Y','V','Y'); | |
108 // sh->o_bih.biCompression = mmioFOURCC('Y','U','Y','2'); | |
109 // sh->o_bih.biPlanes=3; | |
110 // sh->o_bih.biBitCount=16; | |
111 | |
112 #if 0 | |
113 // workaround for pegasus MJPEG: | |
114 if(!sh_video->o_bih.biWidth) sh_video->o_bih.biWidth=sh_video->bih->biWidth; | |
115 if(!sh_video->o_bih.biHeight) sh_video->o_bih.biHeight=sh_video->bih->biHeight; | |
116 if(!sh_video->o_bih.biPlanes) sh_video->o_bih.biPlanes=sh_video->bih->biPlanes; | |
117 #endif | |
118 | |
119 switch (outfmt) | |
120 { | |
121 /* planar format */ | |
122 case IMGFMT_YV12: | |
123 case IMGFMT_I420: | |
124 case IMGFMT_IYUV: | |
125 priv->o_bih->biBitCount=12; | |
126 yuv=1; | |
127 break; | |
128 case IMGFMT_YVU9: | |
129 case IMGFMT_IF09: | |
130 priv->o_bih->biBitCount=9; | |
131 yuv=1; | |
132 break; | |
133 /* packed format */ | |
134 case IMGFMT_YUY2: | |
135 case IMGFMT_UYVY: | |
136 case IMGFMT_YVYU: | |
137 priv->o_bih->biBitCount=16; | |
138 yuv=1; | |
139 break; | |
140 /* rgb/bgr format */ | |
141 case IMGFMT_RGB8: | |
142 case IMGFMT_BGR8: | |
143 priv->o_bih->biBitCount=8; | |
144 break; | |
145 case IMGFMT_RGB15: | |
146 case IMGFMT_RGB16: | |
147 case IMGFMT_BGR15: | |
148 case IMGFMT_BGR16: | |
149 priv->o_bih->biBitCount=16; | |
150 break; | |
151 case IMGFMT_RGB24: | |
152 case IMGFMT_BGR24: | |
153 priv->o_bih->biBitCount=24; | |
154 break; | |
155 case IMGFMT_RGB32: | |
156 case IMGFMT_BGR32: | |
157 priv->o_bih->biBitCount=32; | |
158 break; | |
159 default: | |
160 mp_msg(MSGT_WIN32,MSGL_ERR,"unsupported image format: 0x%x\n", outfmt); | |
161 return 0; | |
162 } | |
163 | |
164 priv->o_bih->biSizeImage = priv->o_bih->biWidth * priv->o_bih->biHeight * (priv->o_bih->biBitCount/8); | |
165 | |
166 if (!(sh->codec->outflags[sh->outfmtidx]&CODECS_FLAG_FLIP)) { | |
167 priv->o_bih->biHeight=-sh->bih->biHeight; // flip image! | |
168 } | |
169 | |
170 if (yuv && !(sh->codec->outflags[sh->outfmtidx] & CODECS_FLAG_YUVHACK)) | |
171 priv->o_bih->biCompression = outfmt; | |
172 else | |
173 priv->o_bih->biCompression = 0; | |
174 | |
175 if(verbose) | |
176 { | |
177 printf("Input format:\n"); | |
178 printf(" biSize %ld\n", sh->bih->biSize); | |
179 printf(" biWidth %ld\n", sh->bih->biWidth); | |
180 printf(" biHeight %ld\n", sh->bih->biHeight); | |
181 printf(" biPlanes %d\n", sh->bih->biPlanes); | |
182 printf(" biBitCount %d\n", sh->bih->biBitCount); | |
183 printf(" biCompression 0x%lx ('%.4s')\n", sh->bih->biCompression, (char *)&sh->bih->biCompression); | |
184 printf(" biSizeImage %ld\n", sh->bih->biSizeImage); | |
185 printf("Output format:\n"); | |
186 printf(" biSize %ld\n", priv->o_bih->biSize); | |
187 printf(" biWidth %ld\n", priv->o_bih->biWidth); | |
188 printf(" biHeight %ld\n", priv->o_bih->biHeight); | |
189 printf(" biPlanes %d\n", priv->o_bih->biPlanes); | |
190 printf(" biBitCount %d\n", priv->o_bih->biBitCount); | |
191 printf(" biCompression 0x%lx ('%.4s')\n", priv->o_bih->biCompression, (char *)&priv->o_bih->biCompression); | |
192 printf(" biSizeImage %ld\n", priv->o_bih->biSizeImage); | |
193 } | |
194 | |
195 if (ICDecompressQueryEx(priv->handle, sh->bih, priv->o_bih)) | |
196 { | |
197 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressQuery failed: Error %d\n", (int)ret); | |
198 // return 0; | |
199 } else | |
200 mp_msg(MSGT_WIN32,MSGL_V,"ICDecompressQuery OK\n"); | |
201 | |
202 if (ICDecompressBeginEx(priv->handle, sh->bih, priv->o_bih)) | |
203 { | |
204 mp_msg(MSGT_WIN32,MSGL_ERR,"ICDecompressBegin failed: Error %d\n", (int)ret); | |
205 // return 0; | |
206 } | |
207 | |
208 if (yuv && sh->codec->outflags[sh->outfmtidx] & CODECS_FLAG_YUVHACK) | |
209 priv->o_bih->biCompression = outfmt; | |
210 | |
211 ICSendMessage(priv->handle, ICM_USER+80, (long)(&divx_quality) ,NULL); | |
212 | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
213 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YUY2)) return 0; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
214 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Win32 video codec init OK!\n"); |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
215 return 1; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
216 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
217 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
218 // uninit driver |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
219 static void uninit(sh_video_t *sh){ |
7229 | 220 HRESULT ret; |
221 vd_vfw_ctx *priv = sh->context; | |
222 | |
223 ret = ICDecompressEnd(priv->handle); | |
224 if (ret) | |
225 { | |
226 mp_msg(MSGT_WIN32, MSGL_WARN, "ICDecompressEnd failed: %d\n", ret); | |
227 return(0); | |
228 } | |
229 | |
230 ret = ICClose(priv->handle); | |
231 if (ret) | |
232 { | |
233 mp_msg(MSGT_WIN32, MSGL_WARN, "ICClose failed: %d\n", ret); | |
234 return(0); | |
235 } | |
236 | |
237 free(priv->o_bih); | |
238 free(priv); | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
239 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
240 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
241 // decode a frame |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
242 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ |
7229 | 243 vd_vfw_ctx *priv = sh->context; |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
244 mp_image_t* mpi; |
7229 | 245 HRESULT ret; |
246 | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
247 if(len<=0) return NULL; // skipped frame |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
248 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
249 mpi=mpcodecs_get_image(sh, |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
250 (sh->codec->outflags[sh->outfmtidx] & CODECS_FLAG_STATIC) ? |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
251 MP_IMGTYPE_STATIC : MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_WIDTH, |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
252 sh->disp_w, sh->disp_h); |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
253 if(!mpi){ // temporary! |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
254 printf("couldn't allocate image for cinepak codec\n"); |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
255 return NULL; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
256 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
257 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
258 // set stride: (trick discovered by Andreas Ackermann - thanx!) |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
259 sh->bih->biWidth=mpi->width; //mpi->stride[0]/(mpi->bpp/8); |
7229 | 260 priv->o_bih->biWidth=mpi->width; //mpi->stride[0]/(mpi->bpp/8); |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
261 |
7229 | 262 sh->bih->biSizeImage = len; |
263 | |
264 ret = ICDecompressEx(priv->handle, | |
265 ( (sh->ds->flags&1) ? 0 : ICDECOMPRESS_NOTKEYFRAME ) | | |
266 ( ((flags&3)==2 && !(sh->ds->flags&1))?(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL):0 ), | |
267 sh->bih, data, priv->o_bih, (flags&3) ? 0 : mpi->planes[0]); | |
268 | |
269 if ((int)ret){ | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
270 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error decompressing frame, err=%d\n",ret); |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
271 return NULL; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
272 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
273 |
7229 | 274 // export palette: |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
275 if(mpi->imgfmt==IMGFMT_RGB8 || mpi->imgfmt==IMGFMT_BGR8){ |
7229 | 276 if(priv->o_bih->biSize>40) |
277 { | |
278 mpi->planes[1]=((unsigned char*)priv->o_bih)+40; | |
279 mp_dbg(MSGT_DECVIDEO, MSGL_DBG2, "Found and copied palette\n"); | |
280 } | |
281 else | |
7175
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
282 mpi->planes[1]=NULL; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
283 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
284 |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
285 return mpi; |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
286 } |
f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
arpi
parents:
diff
changeset
|
287 #endif |