1 /*****************************************************************************
2 * XvMC Wrapper including the Nonstandard VLD extension.
3 *
4 * Copyright (c) 2004 The Unichrome project. All rights reserved.
5 *
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 *
25 * Author: Thomas Hellström (2004)
26 */
27
28 /*
29 * BUGS: The wrapper really should maintain one symbol table per port. This
30 * could possibly be impemented, To do that, the port-independent symbols need to be lifted out,
31 * and one would have to create a number of mapping tables:
32 *
33 * port -> symbol table
34 * context -> port
35 * surface -> port
36 * subpicture -> port
37 *
38 * and reference the right table when needed.
39 * This needs to be done only if there is a player that wants to access two displays with different
40 * hardware simultaneously. Not likely as of today.
41 */
42
43 #ifdef HAVE_CONFIG_H
44 #include "config.h"
45 #endif
46
47 #include <X11/Xlib.h>
48 #include <X11/extensions/XvMC.h>
49 #include <X11/extensions/XvMClib.h>
50 #include "X11/extensions/vldXvMC.h"
51 #include <dlfcn.h>
52 #include <stdio.h>
53 #include <string.h>
54 #include <ctype.h>
55 #include <stdlib.h>
56
57
58 typedef Bool (*XvMCQueryExtensionP) (Display *, int *, int *);
59 typedef Status (*XvMCQueryVersionP) (Display *, int *,int *);
60 typedef XvMCSurfaceInfo * (*XvMCListSurfaceTypesP)(Display *, XvPortID, int *);
61 typedef Status (* XvMCCreateContextP) (Display *,XvPortID,int ,int ,int ,int ,XvMCContext * );
62 typedef Status (*XvMCDestroyContextP) (Display *, XvMCContext * );
63 typedef Status (*XvMCCreateSurfaceP)(Display *,XvMCContext *,XvMCSurface *);
64 typedef Status (*XvMCDestroySurfaceP)(Display *, XvMCSurface *);
65 typedef XvImageFormatValues * (*XvMCListSubpictureTypesP) (Display *,XvPortID ,int ,int *);
66 typedef Status (*XvMCPutSurfaceP)(Display *,XvMCSurface *,Drawable ,short , short , unsigned short ,
67 unsigned short ,short ,short ,unsigned short ,unsigned short ,int );
68 typedef Status (*XvMCHideSurfaceP)(Display *, XvMCSurface *);
69 typedef Status (*XvMCCreateSubpictureP) (Display *, XvMCContext *, XvMCSubpicture *,
70 unsigned short, unsigned short,int);
71 typedef Status (*XvMCClearSubpictureP) (Display *,XvMCSubpicture *,short,short,unsigned short,unsigned short,
72 unsigned int);
73 typedef Status (*XvMCCompositeSubpictureP) (Display *, XvMCSubpicture *,XvImage *,short,short,
74 unsigned short, unsigned short,short,short);
75 typedef Status (*XvMCDestroySubpictureP) (Display *, XvMCSubpicture *);
76 typedef Status (*XvMCSetSubpicturePaletteP) (Display *, XvMCSubpicture *, unsigned char *);
77 typedef Status (*XvMCBlendSubpictureP) (Display *d,XvMCSurface *,XvMCSubpicture *,short,
78 short,unsigned short,unsigned short,short,short,
79 unsigned short,unsigned short);
80 typedef Status (*XvMCBlendSubpicture2P) (Display *,XvMCSurface *,XvMCSurface *,
81 XvMCSubpicture *,short,short,unsigned short,
82 unsigned short,short,short,unsigned short,
83 unsigned short);
84 typedef Status (*XvMCSyncSurfaceP) (Display *, XvMCSurface *);
85 typedef Status (*XvMCFlushSurfaceP) (Display *, XvMCSurface *);
86 typedef Status (*XvMCGetSurfaceStatusP) (Display *, XvMCSurface *, int *);
87 typedef Status (*XvMCRenderSurfaceP) (Display *,XvMCContext *,unsigned int,XvMCSurface *,
88 XvMCSurface *,XvMCSurface *,unsigned int,unsigned int,
89 unsigned int,XvMCMacroBlockArray *,XvMCBlockArray *);
90 typedef Status (*XvMCSyncSubpictureP) (Display *, XvMCSubpicture *);
91 typedef Status (*XvMCFlushSubpictureP) (Display *, XvMCSubpicture *);
92 typedef Status (*XvMCGetSubpictureStatusP) (Display *, XvMCSubpicture *, int *);
93 typedef Status (*XvMCCreateBlocksP) (Display *, XvMCContext *,unsigned int,XvMCBlockArray *);
94 typedef Status (*XvMCDestroyBlocksP) (Display *,XvMCBlockArray *);
95 typedef Status (*XvMCCreateMacroBlocksP) (Display *,XvMCContext *,unsigned int,
96 XvMCMacroBlockArray *);
97 typedef Status (*XvMCDestroyMacroBlocksP) (Display *,XvMCMacroBlockArray *);
98 typedef XvAttribute *(*XvMCQueryAttributesP) (Display *,XvMCContext *,int *);
99 typedef Status (*XvMCSetAttributeP) (Display *,XvMCContext *, Atom, int);
100 typedef Status (*XvMCGetAttributeP) (Display *,XvMCContext *, Atom, int *);
101
102 /*
103 * Nonstandard VLD acceleration level:
104 */
105
106 typedef Status (*XvMCBeginSurfaceP) (Display *,XvMCContext *,XvMCSurface *,
107 XvMCSurface *,XvMCSurface *f,const XvMCMpegControl *);
108 typedef Status (*XvMCLoadQMatrixP) (Display *, XvMCContext *,const XvMCQMatrix *);
109 typedef Status (*XvMCPutSliceP)(Display *,XvMCContext *, char *,int);
110 typedef Status (*XvMCPutSlice2P)(Display *,XvMCContext *, char *,int, unsigned);
111 typedef Status (*XvMCGetDRInfoP)(Display *, XvPortID, char **, char **, int *, int *,
112 int *, int *);
113
114
115 typedef struct {
116 XvMCQueryExtensionP XvMCQueryExtension;
117 XvMCQueryVersionP XvMCQueryVersion;
118 XvMCListSurfaceTypesP XvMCListSurfaceTypes;
119 XvMCCreateContextP XvMCCreateContext;
120 XvMCDestroyContextP XvMCDestroyContext;
121 XvMCCreateSurfaceP XvMCCreateSurface;
122 XvMCDestroySurfaceP XvMCDestroySurface;
123 XvMCListSubpictureTypesP XvMCListSubpictureTypes;
124 XvMCPutSurfaceP XvMCPutSurface;
125 XvMCHideSurfaceP XvMCHideSurface;
126 XvMCCreateSubpictureP XvMCCreateSubpicture;
127 XvMCClearSubpictureP XvMCClearSubpicture;
128 XvMCCompositeSubpictureP XvMCCompositeSubpicture;
129 XvMCDestroySubpictureP XvMCDestroySubpicture;
130 XvMCSetSubpicturePaletteP XvMCSetSubpicturePalette;
131 XvMCBlendSubpictureP XvMCBlendSubpicture;
132 XvMCBlendSubpicture2P XvMCBlendSubpicture2;
133 XvMCSyncSurfaceP XvMCSyncSurface;
134 XvMCFlushSurfaceP XvMCFlushSurface;
135 XvMCGetSurfaceStatusP XvMCGetSurfaceStatus;
136 XvMCRenderSurfaceP XvMCRenderSurface;
137 XvMCSyncSubpictureP XvMCSyncSubpicture;
138 XvMCFlushSubpictureP XvMCFlushSubpicture;
139 XvMCGetSubpictureStatusP XvMCGetSubpictureStatus;
140 XvMCCreateBlocksP XvMCCreateBlocks;
141 XvMCDestroyBlocksP XvMCDestroyBlocks;
142 XvMCCreateMacroBlocksP XvMCCreateMacroBlocks;
143 XvMCDestroyMacroBlocksP XvMCDestroyMacroBlocks;
144 XvMCQueryAttributesP XvMCQueryAttributes;
145 XvMCSetAttributeP XvMCSetAttribute;
146 XvMCGetAttributeP XvMCGetAttribute;
147
148 /*
149 * Nonstandard VLD acceleration level:
150 */
151
152 XvMCBeginSurfaceP XvMCBeginSurface;
153 XvMCLoadQMatrixP XvMCLoadQMatrix;
154 XvMCPutSliceP XvMCPutSlice;
155 XvMCPutSlice2P XvMCPutSlice2;
156
157 /*
158 * Driver name function.
159 */
160
161 XvMCGetDRInfoP XvMCGetDRInfo;
162
163 int preInitialised;
164 int initialised;
165 int vldextension;
166 } XvMCWrapper;
167
168 static XvMCWrapper xW;
169 static int wrapperInit = 0;
170 static int wrapperPreInit = 0;
171 static void *xvhandle;
172 static void *handle2;
173
174 #define BUFLEN 200
175
176 #define STRS(ARG) STR(ARG)
177 #define STR(ARG) #ARG
178
179 #define XW_RSYM(base,handle,handle2,pointer, retval) \
180 do { \
181 register char *symerr; \
182 base.pointer = (pointer##P) dlsym((handle),#pointer); \
183 if ((symerr = dlerror()) != NULL) { \
184 if (!handle2) { \
185 fprintf(stderr,"%s\n",symerr); return retval; \
186 } \
187 base.pointer = (pointer##P) dlsym((handle2),#pointer); \
188 if ((symerr = dlerror()) != NULL) { \
189 fprintf(stderr,"%s\n",symerr); return retval; \
190 } \
191 } \
192 } while (0);
193
194 #define XW_RSYM2(base,handle,handle2,pointer) \
195 base.pointer = (pointer##P) dlsym((handle),#pointer); \
196 if (dlerror() != NULL) { \
197 base.pointer = (pointer##P) dlsym((handle2),#pointer); \
198 if (dlerror() != NULL) return; \
199 }
200
201
202 /*
203 * Try to dlopen a shared library, versionless first.
204 */
205
206
dlopenversion(const char * lib,const char * version,int flag)207 static void *dlopenversion(const char *lib, const char *version, int flag)
208 {
209 void *ret;
210 int curLen,verLen;
211 char *curName;
212 const char *tail;
213
214
215 curLen = strlen(lib) + (verLen = strlen(version)) + 1;
216 curName = (char *) malloc(curLen * sizeof(char));
217 strncpy( curName, lib, curLen);
218 if (verLen > 1) {
219 if (NULL != (tail = strstr(version+1,"."))) {
220 strncat( curName, version, tail - version);
221 } else {
222 strncat( curName, version, verLen);
223 }
224 }
225 ret = dlopen(curName, flag);
226 free(curName);
227 return ret;
228 }
229
preInitW(Display * dpy)230 static int preInitW(Display *dpy)
231 {
232
233 /*
234 * Resolve functions that are not hw driver specific.
235 */
236
237 void *handleZ = NULL;
238
239 wrapperPreInit = 1;
240 xW.preInitialised = 0;
241 xW.initialised = 0;
242 xvhandle = dlopenversion("libXv.so", XV_SOVERSION, RTLD_LAZY | RTLD_GLOBAL);
243 if (!xvhandle) {
244 fprintf(stderr,"XvMCWrapper: Warning! Could not open shared "
245 "library \"libXv.so" XV_SOVERSION "\"\nThis may cause relocation "
246 "errors later.\nError was: \"%s\".\n",dlerror());
247 }
248 handle2 = dlopenversion("libXvMC.so", XVMC_SOVERSION, RTLD_LAZY | RTLD_GLOBAL);
249 if (!handle2) {
250 fprintf(stderr,"XvMCWrapper: Could not load XvMC "
251 "library \"libXvMC.so" XVMC_SOVERSION "\". Failing\n");
252 fprintf(stderr,"%s\n",dlerror());
253 return 1;
254 }
255 XW_RSYM(xW, handle2, handleZ, XvMCQueryExtension, 1);
256 XW_RSYM(xW, handle2, handleZ, XvMCQueryVersion, 1);
257 xW.preInitialised = 1;
258 return 0;
259 }
260
initW(Display * dpy,XvPortID port)261 static void initW(Display *dpy, XvPortID port)
262 {
263 char nameBuffer[BUFLEN];
264 void *handle;
265 int tmp;
266 char *clientName = NULL;
267 char *err;
268 FILE *configFile;
269 int nameLen = 0;
270 int major,minor,patchLevel,isLocal;
271 char *busID = NULL;
272
273 wrapperInit = 1;
274 xW.initialised = 0;
275
276 if (!wrapperPreInit)
277 if (preInitW( dpy )) return;
278
279 /*
280 * Will the DDX tell us the client driver name?
281 */
282
283 xW.XvMCGetDRInfo = (XvMCGetDRInfoP)
284 dlsym(handle2,"XvMCGetDRInfo");
285
286 if ((err = dlerror()) == NULL) {
287 if (0 == xW.XvMCGetDRInfo( dpy, port, &clientName, &busID, &major,
288 &minor,&patchLevel, &isLocal)) {
289 nameLen = strlen(clientName);
290 XFree(busID);
291 if (!isLocal) {
292 fprintf(stderr,"XvMCWrapper: X server is not local. Cannot run XvMC.\n");
293 XFree(clientName);
294 return;
295 }
296 } else {
297 clientName = NULL;
298 }
299 }
300
301 if (clientName && (nameLen < BUFLEN-7) && (nameLen > 0)) {
302 nameLen += 3;
303 strncpy(nameBuffer,"lib",BUFLEN-1);
304 strncpy(nameBuffer+3, clientName, BUFLEN-4);
305 strncpy(nameBuffer + nameLen, ".so", BUFLEN-nameLen-1);
306 nameBuffer[BUFLEN-1] = 0;
307 XFree(clientName);
308 handle = dlopenversion(nameBuffer, XVMC_SOVERSION,RTLD_LAZY);
309 } else {
310 /*
311 * No. Try to obtain it from the config file.
312 */
313
314 if (clientName) XFree(clientName);
315
316 configFile = fopen(STRS(XVMC_CONFIGDIR) "/XvMCConfig","r");
317
318 xW.initialised = 0;
319 xW.vldextension = 0;
320
321 if (NULL == configFile) {
322 fprintf(stderr,"XvMCWrapper: Could not open config file \"%s\".\n",
323 STRS(XVMC_CONFIGDIR) "/XvMCConfig");
324 perror("XvMCWrapper");
325 return;
326 }
327
328 if (NULL == fgets(nameBuffer, BUFLEN, configFile)) {
329 fclose(configFile);
330 fprintf(stderr,"XvMCWrapper: Could not read XvMC library name.\n");
331 perror("XvMCWrapper");
332 return;
333 }
334
335 fclose(configFile);
336 if ((tmp = strlen(nameBuffer)) == 0) {
337 fprintf(stderr,"XvMCWrapper: Zero length XvMC library name.\n");
338 fprintf(stderr,"%s\n",dlerror());
339 return;
340 }
341
342 /*
343 * Skip trailing newlines and garbage.
344 */
345
346 while (iscntrl(nameBuffer[tmp-1])) {
347 nameBuffer[tmp-1] = 0;
348 if (--tmp == 0) {
349 fprintf(stderr,"XvMCWrapper: Zero length XvMC library name.\n");
350 return;
351 }
352 }
353 handle = dlopen(nameBuffer,RTLD_LAZY);
354 }
355 if (!handle) {
356 fprintf(stderr,"XvMCWrapper: Could not load hardware specific XvMC "
357 "library \"%s\".\n",nameBuffer);
358 fprintf(stderr,"%s\n",dlerror());
359 return;
360 }
361
362 XW_RSYM(xW, handle, handle2, XvMCListSurfaceTypes,);
363 XW_RSYM(xW, handle, handle2, XvMCCreateContext,);
364 XW_RSYM(xW, handle, handle2, XvMCDestroyContext,);
365 XW_RSYM(xW, handle, handle2, XvMCCreateSurface,);
366 XW_RSYM(xW, handle, handle2, XvMCDestroySurface,);
367 XW_RSYM(xW, handle, handle2, XvMCListSubpictureTypes,);
368 XW_RSYM(xW, handle, handle2, XvMCHideSurface,);
369 XW_RSYM(xW, handle, handle2, XvMCCreateSubpicture,);
370 XW_RSYM(xW, handle, handle2, XvMCClearSubpicture,);
371 XW_RSYM(xW, handle, handle2, XvMCCompositeSubpicture,);
372 XW_RSYM(xW, handle, handle2, XvMCDestroySubpicture,);
373 XW_RSYM(xW, handle, handle2, XvMCSetSubpicturePalette,);
374 XW_RSYM(xW, handle, handle2, XvMCBlendSubpicture,);
375 XW_RSYM(xW, handle, handle2, XvMCBlendSubpicture2,);
376 XW_RSYM(xW, handle, handle2, XvMCPutSurface,);
377 XW_RSYM(xW, handle, handle2, XvMCSyncSurface,);
378 XW_RSYM(xW, handle, handle2, XvMCFlushSurface,);
379 XW_RSYM(xW, handle, handle2, XvMCGetSurfaceStatus,);
380 XW_RSYM(xW, handle, handle2, XvMCRenderSurface,);
381 XW_RSYM(xW, handle, handle2, XvMCSyncSubpicture,);
382 XW_RSYM(xW, handle, handle2, XvMCFlushSubpicture,);
383 XW_RSYM(xW, handle, handle2, XvMCGetSubpictureStatus,);
384 XW_RSYM(xW, handle, handle2, XvMCCreateBlocks,);
385 XW_RSYM(xW, handle, handle2, XvMCDestroyBlocks,);
386 XW_RSYM(xW, handle, handle2, XvMCCreateMacroBlocks,);
387 XW_RSYM(xW, handle, handle2, XvMCDestroyMacroBlocks,);
388 XW_RSYM(xW, handle, handle2, XvMCQueryAttributes,);
389 XW_RSYM(xW, handle, handle2, XvMCSetAttribute,);
390 XW_RSYM(xW, handle, handle2, XvMCGetAttribute,);
391 xW.initialised = 1;
392 XW_RSYM2(xW, handle, handle2, XvMCBeginSurface);
393 XW_RSYM(xW, handle, handle2, XvMCLoadQMatrix,);
394 XW_RSYM(xW, handle, handle2, XvMCPutSlice,);
395 XW_RSYM(xW, handle, handle2, XvMCPutSlice2,);
396 xW.vldextension = 1;
397 }
398
399
XvMCQueryExtension(Display * display,int * eventBase,int * errBase)400 Bool XvMCQueryExtension (Display *display, int *eventBase, int *errBase)
401 {
402 if (!wrapperPreInit) preInitW( display );
403 if (!xW.preInitialised) return 0;
404 return (*xW.XvMCQueryExtension)(display, eventBase, errBase);
405 }
406
XvMCQueryVersion(Display * display,int * major_versionp,int * minor_versionp)407 Status XvMCQueryVersion (Display *display, int *major_versionp,
408 int *minor_versionp)
409 {
410 if (!wrapperPreInit) preInitW( display );
411 if (!xW.preInitialised) return 0;
412 return (*xW.XvMCQueryVersion)(display, major_versionp, minor_versionp);
413 }
414
415
XvMCListSurfaceTypes(Display * dpy,XvPortID port,int * num)416 XvMCSurfaceInfo * XvMCListSurfaceTypes(Display *dpy, XvPortID port, int *num)
417 {
418 if (!wrapperInit) initW( dpy, port);
419 if (!xW.initialised) return NULL;
420 return (*xW.XvMCListSurfaceTypes)(dpy, port, num);
421 }
422
XvMCCreateContext(Display * display,XvPortID port,int surface_type_id,int width,int height,int flags,XvMCContext * context)423 Status XvMCCreateContext (
424 Display *display,
425 XvPortID port,
426 int surface_type_id,
427 int width,
428 int height,
429 int flags,
430 XvMCContext * context
431 )
432 {
433 if (!wrapperInit) initW(display, port);
434 if (!xW.initialised) return BadValue;
435 return (*xW.XvMCCreateContext)(display, port, surface_type_id,
436 width, height, flags, context);
437 }
438
XvMCDestroyContext(Display * display,XvMCContext * context)439 Status XvMCDestroyContext (Display *display, XvMCContext * context)
440 {
441 if (!xW.initialised) return BadValue;
442 return (*xW.XvMCDestroyContext)(display, context);
443 }
444
445 Status
XvMCCreateSurface(Display * display,XvMCContext * context,XvMCSurface * surface)446 XvMCCreateSurface(
447 Display *display,
448 XvMCContext * context,
449 XvMCSurface * surface
450 )
451 {
452 if (!xW.initialised) return BadValue;
453 return (*xW.XvMCCreateSurface)(display, context, surface);
454 }
455
XvMCDestroySurface(Display * display,XvMCSurface * surface)456 Status XvMCDestroySurface(Display *display, XvMCSurface *surface)
457 {
458 if (!xW.initialised) return BadValue;
459 return (*xW.XvMCDestroySurface)(display, surface);
460 }
461
462
XvMCListSubpictureTypes(Display * display,XvPortID port,int surface_type_id,int * count_return)463 XvImageFormatValues * XvMCListSubpictureTypes (
464 Display * display,
465 XvPortID port,
466 int surface_type_id,
467 int *count_return
468 )
469 {
470 if (!xW.initialised) return NULL;
471 return (*xW.XvMCListSubpictureTypes)(display, port, surface_type_id,
472 count_return);
473 }
474
475
476 Status
XvMCPutSurface(Display * display,XvMCSurface * surface,Drawable draw,short srcx,short srcy,unsigned short srcw,unsigned short srch,short destx,short desty,unsigned short destw,unsigned short desth,int flags)477 XvMCPutSurface(
478 Display *display,
479 XvMCSurface *surface,
480 Drawable draw,
481 short srcx,
482 short srcy,
483 unsigned short srcw,
484 unsigned short srch,
485 short destx,
486 short desty,
487 unsigned short destw,
488 unsigned short desth,
489 int flags
490 )
491 {
492 if (!xW.initialised) return BadValue;
493 return (*xW.XvMCPutSurface)(display, surface, draw, srcx, srcy, srcw, srch,
494 destx, desty, destw, desth, flags);
495 }
496
XvMCHideSurface(Display * display,XvMCSurface * surface)497 Status XvMCHideSurface(Display *display, XvMCSurface *surface)
498 {
499 if (!xW.initialised) return BadValue;
500 return (*xW.XvMCHideSurface)(display, surface);
501 }
502
503
504 Status
XvMCCreateSubpicture(Display * display,XvMCContext * context,XvMCSubpicture * subpicture,unsigned short width,unsigned short height,int xvimage_id)505 XvMCCreateSubpicture (
506 Display *display,
507 XvMCContext *context,
508 XvMCSubpicture *subpicture,
509 unsigned short width,
510 unsigned short height,
511 int xvimage_id
512 )
513 {
514 if (!xW.initialised) return BadValue;
515 return (*xW.XvMCCreateSubpicture)(display, context, subpicture, width, height,
516 xvimage_id);
517 }
518
519
520 Status
XvMCClearSubpicture(Display * display,XvMCSubpicture * subpicture,short x,short y,unsigned short width,unsigned short height,unsigned int color)521 XvMCClearSubpicture (
522 Display *display,
523 XvMCSubpicture *subpicture,
524 short x,
525 short y,
526 unsigned short width,
527 unsigned short height,
528 unsigned int color
529 )
530 {
531 if (!xW.initialised) return BadValue;
532 return (*xW.XvMCClearSubpicture)(display, subpicture, x, y, width, height, color);
533 }
534
535
536 Status
XvMCCompositeSubpicture(Display * display,XvMCSubpicture * subpicture,XvImage * image,short srcx,short srcy,unsigned short width,unsigned short height,short dstx,short dsty)537 XvMCCompositeSubpicture (
538 Display *display,
539 XvMCSubpicture *subpicture,
540 XvImage *image,
541 short srcx,
542 short srcy,
543 unsigned short width,
544 unsigned short height,
545 short dstx,
546 short dsty
547 )
548 {
549 if (!xW.initialised) return BadValue;
550 return (*xW.XvMCCompositeSubpicture)(display, subpicture, image, srcx, srcy,
551 width, height, dstx, dsty);
552 }
553
554 Status
XvMCDestroySubpicture(Display * display,XvMCSubpicture * subpicture)555 XvMCDestroySubpicture (Display *display, XvMCSubpicture *subpicture)
556 {
557 if (!xW.initialised) return BadValue;
558 return (*xW.XvMCDestroySubpicture)(display, subpicture);
559 }
560
561 Status
XvMCSetSubpicturePalette(Display * display,XvMCSubpicture * subpicture,unsigned char * palette)562 XvMCSetSubpicturePalette (
563 Display *display,
564 XvMCSubpicture *subpicture,
565 unsigned char *palette
566 )
567 {
568 if (!xW.initialised) return BadValue;
569 return (*xW.XvMCSetSubpicturePalette)(display, subpicture, palette);
570 }
571
572
573 Status
XvMCBlendSubpicture(Display * display,XvMCSurface * target_surface,XvMCSubpicture * subpicture,short subx,short suby,unsigned short subw,unsigned short subh,short surfx,short surfy,unsigned short surfw,unsigned short surfh)574 XvMCBlendSubpicture (
575 Display *display,
576 XvMCSurface *target_surface,
577 XvMCSubpicture *subpicture,
578 short subx,
579 short suby,
580 unsigned short subw,
581 unsigned short subh,
582 short surfx,
583 short surfy,
584 unsigned short surfw,
585 unsigned short surfh
586 )
587 {
588 if (!xW.initialised) return BadValue;
589 return (*xW.XvMCBlendSubpicture)(display, target_surface, subpicture,
590 subx, suby, subw, subh, surfx, surfy,
591 surfw, surfh);
592 }
593
594 Status
XvMCBlendSubpicture2(Display * display,XvMCSurface * source_surface,XvMCSurface * target_surface,XvMCSubpicture * subpicture,short subx,short suby,unsigned short subw,unsigned short subh,short surfx,short surfy,unsigned short surfw,unsigned short surfh)595 XvMCBlendSubpicture2 (
596 Display *display,
597 XvMCSurface *source_surface,
598 XvMCSurface *target_surface,
599 XvMCSubpicture *subpicture,
600 short subx,
601 short suby,
602 unsigned short subw,
603 unsigned short subh,
604 short surfx,
605 short surfy,
606 unsigned short surfw,
607 unsigned short surfh
608 )
609 {
610 if (!xW.initialised) return BadValue;
611 return (*xW.XvMCBlendSubpicture2)(display, source_surface, target_surface, subpicture,
612 subx, suby, subw, subh, surfx, surfy, surfw, surfh);
613 }
614
615
XvMCSyncSurface(Display * display,XvMCSurface * surface)616 Status XvMCSyncSurface (Display *display, XvMCSurface *surface)
617 {
618 if (!xW.initialised) return BadValue;
619 return (*xW.XvMCSyncSurface)(display, surface);
620 }
621
XvMCFlushSurface(Display * display,XvMCSurface * surface)622 Status XvMCFlushSurface (Display *display, XvMCSurface *surface)
623 {
624 if (!xW.initialised) return BadValue;
625 return (*xW.XvMCFlushSurface)(display, surface);
626 }
627
XvMCGetSurfaceStatus(Display * display,XvMCSurface * surface,int * stat)628 Status XvMCGetSurfaceStatus (Display *display, XvMCSurface *surface, int *stat)
629 {
630 if (!xW.initialised) return BadValue;
631 return (*xW.XvMCGetSurfaceStatus)(display, surface, stat);
632 }
633
XvMCRenderSurface(Display * display,XvMCContext * context,unsigned int picture_structure,XvMCSurface * target_surface,XvMCSurface * past_surface,XvMCSurface * future_surface,unsigned int flags,unsigned int num_macroblocks,unsigned int first_macroblock,XvMCMacroBlockArray * macroblock_array,XvMCBlockArray * blocks)634 Status XvMCRenderSurface (
635 Display *display,
636 XvMCContext *context,
637 unsigned int picture_structure,
638 XvMCSurface *target_surface,
639 XvMCSurface *past_surface,
640 XvMCSurface *future_surface,
641 unsigned int flags,
642 unsigned int num_macroblocks,
643 unsigned int first_macroblock,
644 XvMCMacroBlockArray *macroblock_array,
645 XvMCBlockArray *blocks
646 )
647 {
648 if (!xW.initialised) return BadValue;
649 return (*xW.XvMCRenderSurface)(display, context, picture_structure, target_surface,
650 past_surface, future_surface, flags, num_macroblocks,
651 first_macroblock, macroblock_array, blocks);
652 }
653
XvMCSyncSubpicture(Display * display,XvMCSubpicture * subpicture)654 Status XvMCSyncSubpicture (Display *display, XvMCSubpicture *subpicture)
655 {
656 if (!xW.initialised) return BadValue;
657 return (*xW.XvMCSyncSubpicture)(display, subpicture);
658 }
659
XvMCFlushSubpicture(Display * display,XvMCSubpicture * subpicture)660 Status XvMCFlushSubpicture (Display *display, XvMCSubpicture *subpicture)
661 {
662 if (!xW.initialised) return BadValue;
663 return (*xW.XvMCFlushSubpicture)(display, subpicture);
664 }
665 Status
XvMCGetSubpictureStatus(Display * display,XvMCSubpicture * subpic,int * stat)666 XvMCGetSubpictureStatus (Display *display, XvMCSubpicture *subpic, int *stat)
667 {
668 if (!xW.initialised) return BadValue;
669 return (*xW.XvMCGetSubpictureStatus)(display, subpic, stat);
670 }
671
XvMCCreateBlocks(Display * display,XvMCContext * context,unsigned int num_blocks,XvMCBlockArray * block)672 Status XvMCCreateBlocks (
673 Display *display,
674 XvMCContext *context,
675 unsigned int num_blocks,
676 XvMCBlockArray *block
677 )
678 {
679 if (!xW.initialised) return BadValue;
680 return (*xW.XvMCCreateBlocks)(display, context, num_blocks, block);
681 }
682
683
XvMCDestroyBlocks(Display * display,XvMCBlockArray * block)684 Status XvMCDestroyBlocks (Display *display,XvMCBlockArray *block)
685 {
686 if (!xW.initialised) return BadValue;
687 return (*xW.XvMCDestroyBlocks)(display, block);
688 }
689
XvMCCreateMacroBlocks(Display * display,XvMCContext * context,unsigned int num_blocks,XvMCMacroBlockArray * blocks)690 Status XvMCCreateMacroBlocks (
691 Display *display,
692 XvMCContext *context,
693 unsigned int num_blocks,
694 XvMCMacroBlockArray *blocks
695 )
696 {
697 if (!xW.initialised) return BadValue;
698 return (*xW.XvMCCreateMacroBlocks)(display, context, num_blocks, blocks);
699 }
700
701
XvMCDestroyMacroBlocks(Display * display,XvMCMacroBlockArray * block)702 Status XvMCDestroyMacroBlocks (
703 Display *display,
704 XvMCMacroBlockArray *block
705 )
706 {
707 if (!xW.initialised) return BadValue;
708 return (*xW.XvMCDestroyMacroBlocks)(display, block);
709 }
710
711
712 XvAttribute *
XvMCQueryAttributes(Display * display,XvMCContext * context,int * number)713 XvMCQueryAttributes (
714 Display *display,
715 XvMCContext *context,
716 int *number
717 )
718 {
719 if (!xW.initialised) return NULL;
720 return (*xW.XvMCQueryAttributes)(display, context, number);
721 }
722
723
724 Status
XvMCSetAttribute(Display * display,XvMCContext * context,Atom attribute,int value)725 XvMCSetAttribute (
726 Display *display,
727 XvMCContext *context,
728 Atom attribute,
729 int value
730 )
731 {
732 if (!xW.initialised) return BadValue;
733 return (*xW.XvMCSetAttribute)(display, context, attribute, value);
734 }
735
736
737 Status
XvMCGetAttribute(Display * display,XvMCContext * context,Atom attribute,int * value)738 XvMCGetAttribute (
739 Display *display,
740 XvMCContext *context,
741 Atom attribute,
742 int *value
743 )
744 {
745 if (!xW.initialised) return BadValue;
746 return (*xW.XvMCGetAttribute)(display, context, attribute, value);
747 }
748
749
XvMCBeginSurface(Display * display,XvMCContext * context,XvMCSurface * target_surface,XvMCSurface * past_surface,XvMCSurface * future_surface,const XvMCMpegControl * control)750 Status XvMCBeginSurface(Display *display,
751 XvMCContext *context,
752 XvMCSurface *target_surface,
753 XvMCSurface *past_surface,
754 XvMCSurface *future_surface,
755 const XvMCMpegControl *control)
756 {
757 if (!xW.vldextension) return BadValue;
758 return (*xW.XvMCBeginSurface)(display, context, target_surface, past_surface, future_surface,
759 control);
760 }
761
XvMCLoadQMatrix(Display * display,XvMCContext * context,const XvMCQMatrix * qmx)762 Status XvMCLoadQMatrix(Display *display, XvMCContext *context,
763 const XvMCQMatrix *qmx)
764 {
765 if (!xW.vldextension) return BadValue;
766 return (*xW.XvMCLoadQMatrix)(display, context, qmx);
767 }
768
XvMCPutSlice(Display * display,XvMCContext * context,char * slice,int nBytes)769 Status XvMCPutSlice(Display *display,XvMCContext *context,
770 char *slice, int nBytes)
771 {
772 if (!xW.vldextension) return BadValue;
773 return (*xW.XvMCPutSlice)(display, context, slice, nBytes);
774 }
775
XvMCPutSlice2(Display * display,XvMCContext * context,char * slice,int nBytes,int sliceCode)776 Status XvMCPutSlice2(Display *display,XvMCContext *context,
777 char *slice, int nBytes, int sliceCode)
778 {
779 if (!xW.vldextension) return BadValue;
780 return (*xW.XvMCPutSlice2)(display, context, slice, nBytes, sliceCode);
781 }
782