Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
1097 lines (873 loc) · 28 KB

File metadata and controls

1097 lines (873 loc) · 28 KB
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/***********************************************************
Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Digital or MIT not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
/* $XFree86: xc/lib/Xv/Xv.c,v 1.15 2001/05/11 08:23:22 alanh Exp $ */
/*
** File:
**
** Xv.c --- Xv library extension module.
**
** Author:
**
** David Carver (Digital Workstation Engineering/Project Athena)
**
** Revisions:
**
** 26.06.91 Carver
** - changed XvFreeAdaptors to XvFreeAdaptorInfo
** - changed XvFreeEncodings to XvFreeEncodingInfo
**
** 11.06.91 Carver
** - changed SetPortControl to SetPortAttribute
** - changed GetPortControl to GetPortAttribute
** - changed QueryBestSize
**
** 15.05.91 Carver
** - version 2.0 upgrade
**
** 240.01.91 Carver
** - version 1.4 upgrade
**
*/
#include <stdio.h>
#include "Xvlibint.h"
Mar 23, 2006
Mar 23, 2006
55
#include "../extensions/Xext.h"
56
#include <X11/extensions/XShm.h>
Feb 16, 2006
Feb 16, 2006
57
#include "../extensions/extutil.h"
58
59
60
61
62
63
64
65
static XExtensionInfo _xv_info_data;
static XExtensionInfo *xv_info = &_xv_info_data;
static char *xv_extension_name = XvName;
#define XvCheckExtension(dpy, i, val) \
XextCheckExtension(dpy, i, xv_extension_name, val)
May 29, 2006
May 29, 2006
66
67
68
static char *xv_error_string();
static int xv_close_display();
static Bool xv_wire_to_event();
69
70
static XExtensionHooks xv_extension_hooks = {
May 28, 2006
May 28, 2006
71
72
73
74
75
76
77
78
79
80
81
NULL, /* create_gc */
NULL, /* copy_gc */
NULL, /* flush_gc */
NULL, /* free_gc */
NULL, /* create_font */
NULL, /* free_font */
xv_close_display, /* close_display */
xv_wire_to_event, /* wire_to_event */
NULL, /* event_to_wire */
NULL, /* error */
xv_error_string /* error_string */
82
83
84
};
May 28, 2006
May 28, 2006
85
86
87
88
static char *xv_error_list[] = {
"BadPort", /* XvBadPort */
"BadEncoding", /* XvBadEncoding */
"BadControl" /* XvBadControl */
89
90
};
May 28, 2006
May 28, 2006
91
static
May 29, 2006
May 29, 2006
92
93
94
95
96
97
98
99
100
101
102
103
XEXT_GENERATE_CLOSE_DISPLAY(xv_close_display, xv_info)
static XEXT_GENERATE_FIND_DISPLAY(xv_find_display, xv_info,
xv_extension_name,
&xv_extension_hooks, XvNumEvents, NULL)
static XEXT_GENERATE_ERROR_STRING(xv_error_string, xv_extension_name,
XvNumErrors, xv_error_list)
int SDL_NAME(XvQueryExtension) (Display * dpy,
unsigned int *p_version,
unsigned int *p_revision,
unsigned int *p_requestBase,
unsigned int *p_eventBase,
unsigned int *p_errorBase)
May 28, 2006
May 28, 2006
104
{
May 29, 2006
May 29, 2006
105
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
106
107
108
xvQueryExtensionReq *req;
xvQueryExtensionReply rep;
May 29, 2006
May 29, 2006
109
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
111
LockDisplay(dpy);
May 29, 2006
May 29, 2006
113
XvGetReq(QueryExtension, req);
May 29, 2006
May 29, 2006
115
116
117
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
118
119
return XvBadExtension;
}
May 28, 2006
May 28, 2006
121
122
123
124
125
*p_version = rep.version;
*p_revision = rep.revision;
*p_requestBase = info->codes->major_opcode;
*p_eventBase = info->codes->first_event;
*p_errorBase = info->codes->first_error;
May 29, 2006
May 29, 2006
127
128
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
129
130
return Success;
131
132
133
}
int
May 29, 2006
May 29, 2006
134
135
136
137
SDL_NAME(XvQueryAdaptors) (Display * dpy,
Window window,
unsigned int *p_nAdaptors,
SDL_NAME(XvAdaptorInfo) ** p_pAdaptors)
May 28, 2006
May 28, 2006
138
{
May 29, 2006
May 29, 2006
139
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
140
141
142
143
xvQueryAdaptorsReq *req;
xvQueryAdaptorsReply rep;
int size, ii, jj;
char *name;
May 29, 2006
May 29, 2006
144
145
SDL_NAME(XvAdaptorInfo) * pas, *pa;
SDL_NAME(XvFormat) * pfs, *pf;
May 28, 2006
May 28, 2006
146
147
char *buffer;
union
May 28, 2006
May 28, 2006
149
150
151
152
char *buffer;
char *string;
xvAdaptorInfo *pa;
xvFormat *pf;
153
} u;
May 28, 2006
May 28, 2006
154
May 29, 2006
May 29, 2006
155
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
156
May 29, 2006
May 29, 2006
157
LockDisplay(dpy);
May 28, 2006
May 28, 2006
158
May 29, 2006
May 29, 2006
159
XvGetReq(QueryAdaptors, req);
May 28, 2006
May 28, 2006
160
161
162
163
req->window = window;
/* READ THE REPLY */
May 29, 2006
May 29, 2006
164
165
166
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
167
168
169
170
return (XvBadReply);
}
size = rep.length << 2;
May 29, 2006
May 29, 2006
171
172
173
if ((buffer = (char *) Xmalloc((unsigned) size)) == NULL) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
174
175
return (XvBadAlloc);
}
May 29, 2006
May 29, 2006
176
_XRead(dpy, buffer, size);
May 28, 2006
May 28, 2006
177
178
179
180
181
182
183
184
u.buffer = buffer;
/* GET INPUT ADAPTORS */
if (rep.num_adaptors == 0) {
pas = NULL;
} else {
May 29, 2006
May 29, 2006
185
186
187
188
189
size = rep.num_adaptors * sizeof(SDL_NAME(XvAdaptorInfo));
if ((pas = (SDL_NAME(XvAdaptorInfo) *) Xmalloc(size)) == NULL) {
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
190
191
192
193
194
195
196
197
198
199
return (XvBadAlloc);
}
}
/* INIT ADAPTOR FIELDS */
pa = pas;
for (ii = 0; ii < rep.num_adaptors; ii++) {
pa->num_adaptors = 0;
pa->name = (char *) NULL;
May 29, 2006
May 29, 2006
200
pa->formats = (SDL_NAME(XvFormat) *) NULL;
May 28, 2006
May 28, 2006
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
pa++;
}
pa = pas;
for (ii = 0; ii < rep.num_adaptors; ii++) {
pa->type = u.pa->type;
pa->base_id = u.pa->base_id;
pa->num_ports = u.pa->num_ports;
pa->num_formats = u.pa->num_formats;
pa->num_adaptors = rep.num_adaptors - ii;
/* GET ADAPTOR NAME */
size = u.pa->name_size;
u.buffer += (sz_xvAdaptorInfo + 3) & ~3;
May 29, 2006
May 29, 2006
217
218
219
220
221
if ((name = (char *) Xmalloc(size + 1)) == NULL) {
SDL_NAME(XvFreeAdaptorInfo) (pas);
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
222
223
return (XvBadAlloc);
}
May 29, 2006
May 29, 2006
224
SDL_strlcpy(name, u.string, size);
May 28, 2006
May 28, 2006
225
226
227
228
229
230
pa->name = name;
u.buffer += (size + 3) & ~3;
/* GET FORMATS */
May 29, 2006
May 29, 2006
231
232
233
234
235
236
size = pa->num_formats * sizeof(SDL_NAME(XvFormat));
if ((pfs = (SDL_NAME(XvFormat) *) Xmalloc(size)) == NULL) {
SDL_NAME(XvFreeAdaptorInfo) (pas);
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
return (XvBadAlloc);
}
pf = pfs;
for (jj = 0; jj < pa->num_formats; jj++) {
pf->depth = u.pf->depth;
pf->visual_id = u.pf->visual;
pf++;
u.buffer += (sz_xvFormat + 3) & ~3;
}
pa->formats = pfs;
pa++;
}
*p_nAdaptors = rep.num_adaptors;
*p_pAdaptors = pas;
May 29, 2006
May 29, 2006
258
259
260
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
261
262
return (Success);
263
264
265
}
May 29, 2006
May 29, 2006
266
void SDL_NAME(XvFreeAdaptorInfo) (SDL_NAME(XvAdaptorInfo) * pAdaptors)
267
268
{
May 29, 2006
May 29, 2006
269
SDL_NAME(XvAdaptorInfo) * pa;
May 28, 2006
May 28, 2006
270
int ii;
May 28, 2006
May 28, 2006
272
273
if (!pAdaptors)
return;
May 28, 2006
May 28, 2006
275
pa = pAdaptors;
May 28, 2006
May 28, 2006
277
278
for (ii = 0; ii < pAdaptors->num_adaptors; ii++, pa++) {
if (pa->name) {
May 29, 2006
May 29, 2006
279
Xfree(pa->name);
May 28, 2006
May 28, 2006
280
281
}
if (pa->formats) {
May 29, 2006
May 29, 2006
282
Xfree(pa->formats);
May 28, 2006
May 28, 2006
283
284
285
}
}
May 29, 2006
May 29, 2006
286
Xfree(pAdaptors);
287
288
289
}
int
May 29, 2006
May 29, 2006
290
291
292
293
SDL_NAME(XvQueryEncodings) (Display * dpy,
XvPortID port,
unsigned int *p_nEncodings,
SDL_NAME(XvEncodingInfo) ** p_pEncodings)
May 28, 2006
May 28, 2006
294
{
May 29, 2006
May 29, 2006
295
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
296
297
298
299
xvQueryEncodingsReq *req;
xvQueryEncodingsReply rep;
int size, jj;
char *name;
May 29, 2006
May 29, 2006
300
SDL_NAME(XvEncodingInfo) * pes, *pe;
May 28, 2006
May 28, 2006
301
302
char *buffer;
union
May 28, 2006
May 28, 2006
304
305
306
char *buffer;
char *string;
xvEncodingInfo *pe;
307
} u;
May 28, 2006
May 28, 2006
308
May 29, 2006
May 29, 2006
309
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
310
May 29, 2006
May 29, 2006
311
LockDisplay(dpy);
May 28, 2006
May 28, 2006
312
May 29, 2006
May 29, 2006
313
XvGetReq(QueryEncodings, req);
May 28, 2006
May 28, 2006
314
315
316
317
req->port = port;
/* READ THE REPLY */
May 29, 2006
May 29, 2006
318
319
320
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
321
322
323
324
return (XvBadReply);
}
size = rep.length << 2;
May 29, 2006
May 29, 2006
325
326
327
if ((buffer = (char *) Xmalloc((unsigned) size)) == NULL) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
328
329
return (XvBadAlloc);
}
May 29, 2006
May 29, 2006
330
_XRead(dpy, buffer, size);
May 28, 2006
May 28, 2006
331
332
333
334
335
u.buffer = buffer;
/* GET ENCODINGS */
May 29, 2006
May 29, 2006
336
337
338
339
340
size = rep.num_encodings * sizeof(SDL_NAME(XvEncodingInfo));
if ((pes = (SDL_NAME(XvEncodingInfo) *) Xmalloc(size)) == NULL) {
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
return (XvBadAlloc);
}
/* INITIALIZE THE ENCODING POINTER */
pe = pes;
for (jj = 0; jj < rep.num_encodings; jj++) {
pe->name = (char *) NULL;
pe->num_encodings = 0;
pe++;
}
pe = pes;
for (jj = 0; jj < rep.num_encodings; jj++) {
pe->encoding_id = u.pe->encoding;
pe->width = u.pe->width;
pe->height = u.pe->height;
pe->rate.numerator = u.pe->rate.numerator;
pe->rate.denominator = u.pe->rate.denominator;
pe->num_encodings = rep.num_encodings - jj;
size = u.pe->name_size;
u.buffer += (sz_xvEncodingInfo + 3) & ~3;
May 29, 2006
May 29, 2006
365
366
367
368
if ((name = (char *) Xmalloc(size + 1)) == NULL) {
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
369
370
return (XvBadAlloc);
}
May 29, 2006
May 29, 2006
371
SDL_strlcpy(name, u.string, size);
May 28, 2006
May 28, 2006
372
373
374
375
376
377
378
379
380
pe->name = name;
pe++;
u.buffer += (size + 3) & ~3;
}
*p_nEncodings = rep.num_encodings;
*p_pEncodings = pes;
May 29, 2006
May 29, 2006
381
382
383
Xfree(buffer);
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
384
385
return (Success);
386
387
}
May 29, 2006
May 29, 2006
388
void SDL_NAME(XvFreeEncodingInfo) (SDL_NAME(XvEncodingInfo) * pEncodings)
389
390
{
May 29, 2006
May 29, 2006
391
SDL_NAME(XvEncodingInfo) * pe;
May 28, 2006
May 28, 2006
392
int ii;
May 28, 2006
May 28, 2006
394
395
if (!pEncodings)
return;
May 28, 2006
May 28, 2006
397
pe = pEncodings;
May 28, 2006
May 28, 2006
399
400
for (ii = 0; ii < pEncodings->num_encodings; ii++, pe++) {
if (pe->name)
May 29, 2006
May 29, 2006
401
Xfree(pe->name);
May 28, 2006
May 28, 2006
402
}
May 29, 2006
May 29, 2006
404
Xfree(pEncodings);
405
406
407
}
int
May 29, 2006
May 29, 2006
408
409
410
411
412
413
414
SDL_NAME(XvPutVideo) (Display * dpy,
XvPortID port,
Drawable d,
GC gc,
int vx, int vy,
unsigned int vw, unsigned int vh,
int dx, int dy, unsigned int dw, unsigned int dh)
May 28, 2006
May 28, 2006
415
{
May 29, 2006
May 29, 2006
416
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
417
418
xvPutVideoReq *req;
May 29, 2006
May 29, 2006
419
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
420
May 29, 2006
May 29, 2006
421
LockDisplay(dpy);
May 28, 2006
May 28, 2006
422
May 29, 2006
May 29, 2006
423
FlushGC(dpy, gc);
May 28, 2006
May 28, 2006
424
May 29, 2006
May 29, 2006
425
XvGetReq(PutVideo, req);
May 28, 2006
May 28, 2006
426
427
428
429
430
431
432
433
434
435
436
437
438
req->port = port;
req->drawable = d;
req->gc = gc->gid;
req->vid_x = vx;
req->vid_y = vy;
req->vid_w = vw;
req->vid_h = vh;
req->drw_x = dx;
req->drw_y = dy;
req->drw_w = dw;
req->drw_h = dh;
May 29, 2006
May 29, 2006
439
440
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
441
442
return Success;
443
444
445
}
int
May 29, 2006
May 29, 2006
446
447
448
449
450
451
452
SDL_NAME(XvPutStill) (Display * dpy,
XvPortID port,
Drawable d,
GC gc,
int vx, int vy,
unsigned int vw, unsigned int vh,
int dx, int dy, unsigned int dw, unsigned int dh)
May 28, 2006
May 28, 2006
453
{
May 29, 2006
May 29, 2006
454
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
455
456
xvPutStillReq *req;
May 29, 2006
May 29, 2006
457
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
458
May 29, 2006
May 29, 2006
459
LockDisplay(dpy);
May 28, 2006
May 28, 2006
460
May 29, 2006
May 29, 2006
461
FlushGC(dpy, gc);
May 28, 2006
May 28, 2006
462
May 29, 2006
May 29, 2006
463
XvGetReq(PutStill, req);
May 28, 2006
May 28, 2006
464
465
466
467
468
469
470
471
472
473
474
475
req->port = port;
req->drawable = d;
req->gc = gc->gid;
req->vid_x = vx;
req->vid_y = vy;
req->vid_w = vw;
req->vid_h = vh;
req->drw_x = dx;
req->drw_y = dy;
req->drw_w = dw;
req->drw_h = dh;
May 29, 2006
May 29, 2006
476
477
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
478
479
return Success;
480
481
482
}
int
May 29, 2006
May 29, 2006
483
484
485
486
487
488
489
SDL_NAME(XvGetVideo) (Display * dpy,
XvPortID port,
Drawable d,
GC gc,
int vx, int vy,
unsigned int vw, unsigned int vh,
int dx, int dy, unsigned int dw, unsigned int dh)
May 28, 2006
May 28, 2006
490
{
May 29, 2006
May 29, 2006
491
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
492
493
xvGetVideoReq *req;
May 29, 2006
May 29, 2006
494
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
495
May 29, 2006
May 29, 2006
496
LockDisplay(dpy);
May 28, 2006
May 28, 2006
497
May 29, 2006
May 29, 2006
498
FlushGC(dpy, gc);
May 28, 2006
May 28, 2006
499
May 29, 2006
May 29, 2006
500
XvGetReq(GetVideo, req);
May 28, 2006
May 28, 2006
501
502
503
504
505
506
507
508
509
510
511
512
req->port = port;
req->drawable = d;
req->gc = gc->gid;
req->vid_x = vx;
req->vid_y = vy;
req->vid_w = vw;
req->vid_h = vh;
req->drw_x = dx;
req->drw_y = dy;
req->drw_w = dw;
req->drw_h = dh;
May 29, 2006
May 29, 2006
513
514
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
515
516
return Success;
517
518
519
}
int
May 29, 2006
May 29, 2006
520
521
522
523
524
525
526
SDL_NAME(XvGetStill) (Display * dpy,
XvPortID port,
Drawable d,
GC gc,
int vx, int vy,
unsigned int vw, unsigned int vh,
int dx, int dy, unsigned int dw, unsigned int dh)
May 28, 2006
May 28, 2006
527
{
May 29, 2006
May 29, 2006
528
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
529
530
xvGetStillReq *req;
May 29, 2006
May 29, 2006
531
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
532
May 29, 2006
May 29, 2006
533
LockDisplay(dpy);
May 28, 2006
May 28, 2006
534
May 29, 2006
May 29, 2006
535
FlushGC(dpy, gc);
May 28, 2006
May 28, 2006
536
May 29, 2006
May 29, 2006
537
XvGetReq(GetStill, req);
May 28, 2006
May 28, 2006
538
539
540
541
542
543
544
545
546
547
548
549
req->port = port;
req->drawable = d;
req->gc = gc->gid;
req->vid_x = vx;
req->vid_y = vy;
req->vid_w = vw;
req->vid_h = vh;
req->drw_x = dx;
req->drw_y = dy;
req->drw_w = dw;
req->drw_h = dh;
May 29, 2006
May 29, 2006
550
551
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
552
553
return Success;
554
555
}
May 29, 2006
May 29, 2006
556
int SDL_NAME(XvStopVideo) (Display * dpy, XvPortID port, Drawable draw)
May 28, 2006
May 28, 2006
557
{
May 29, 2006
May 29, 2006
558
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
559
xvStopVideoReq *req;
May 29, 2006
May 29, 2006
561
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
563
LockDisplay(dpy);
May 29, 2006
May 29, 2006
565
XvGetReq(StopVideo, req);
May 28, 2006
May 28, 2006
566
567
req->port = port;
req->drawable = draw;
May 29, 2006
May 29, 2006
569
570
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
572
return Success;
573
574
}
May 29, 2006
May 29, 2006
575
int SDL_NAME(XvGrabPort) (Display * dpy, XvPortID port, Time time)
May 28, 2006
May 28, 2006
576
{
May 29, 2006
May 29, 2006
577
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
578
579
580
int result;
xvGrabPortReply rep;
xvGrabPortReq *req;
May 29, 2006
May 29, 2006
582
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
584
LockDisplay(dpy);
May 29, 2006
May 29, 2006
586
XvGetReq(GrabPort, req);
May 28, 2006
May 28, 2006
587
588
req->port = port;
req->time = time;
May 29, 2006
May 29, 2006
590
if (_XReply(dpy, (xReply *) & rep, 0, xTrue) == 0)
May 28, 2006
May 28, 2006
591
rep.result = GrabSuccess;
May 28, 2006
May 28, 2006
593
result = rep.result;
May 29, 2006
May 29, 2006
595
596
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
598
return result;
599
600
}
May 29, 2006
May 29, 2006
601
int SDL_NAME(XvUngrabPort) (Display * dpy, XvPortID port, Time time)
May 28, 2006
May 28, 2006
602
{
May 29, 2006
May 29, 2006
603
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
604
xvUngrabPortReq *req;
May 29, 2006
May 29, 2006
606
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
608
LockDisplay(dpy);
May 29, 2006
May 29, 2006
610
XvGetReq(UngrabPort, req);
May 28, 2006
May 28, 2006
611
612
req->port = port;
req->time = time;
May 29, 2006
May 29, 2006
614
615
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
617
return Success;
618
619
620
}
int
May 29, 2006
May 29, 2006
621
SDL_NAME(XvSelectVideoNotify) (Display * dpy, Drawable drawable, Bool onoff)
May 28, 2006
May 28, 2006
622
{
May 29, 2006
May 29, 2006
623
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
624
xvSelectVideoNotifyReq *req;
May 29, 2006
May 29, 2006
626
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
628
LockDisplay(dpy);
May 29, 2006
May 29, 2006
630
XvGetReq(SelectVideoNotify, req);
May 28, 2006
May 28, 2006
631
632
req->drawable = drawable;
req->onoff = onoff;
May 29, 2006
May 29, 2006
634
635
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
637
return Success;
638
639
}
May 29, 2006
May 29, 2006
640
int SDL_NAME(XvSelectPortNotify) (Display * dpy, XvPortID port, Bool onoff)
May 28, 2006
May 28, 2006
641
{
May 29, 2006
May 29, 2006
642
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
643
xvSelectPortNotifyReq *req;
May 29, 2006
May 29, 2006
645
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
647
LockDisplay(dpy);
May 29, 2006
May 29, 2006
649
XvGetReq(SelectPortNotify, req);
May 28, 2006
May 28, 2006
650
651
req->port = port;
req->onoff = onoff;
May 29, 2006
May 29, 2006
653
654
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
656
return Success;
657
658
659
}
int
May 29, 2006
May 29, 2006
660
661
SDL_NAME(XvSetPortAttribute) (Display * dpy,
XvPortID port, Atom attribute, int value)
May 29, 2006
May 29, 2006
663
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
664
xvSetPortAttributeReq *req;
May 29, 2006
May 29, 2006
666
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
668
LockDisplay(dpy);
May 29, 2006
May 29, 2006
670
XvGetReq(SetPortAttribute, req);
May 28, 2006
May 28, 2006
671
672
673
req->port = port;
req->attribute = attribute;
req->value = value;
May 29, 2006
May 29, 2006
675
676
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
678
return (Success);
679
680
681
}
int
May 29, 2006
May 29, 2006
682
683
SDL_NAME(XvGetPortAttribute) (Display * dpy,
XvPortID port, Atom attribute, int *p_value)
May 29, 2006
May 29, 2006
685
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
686
687
xvGetPortAttributeReq *req;
xvGetPortAttributeReply rep;
May 29, 2006
May 29, 2006
689
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
691
LockDisplay(dpy);
May 29, 2006
May 29, 2006
693
XvGetReq(GetPortAttribute, req);
May 28, 2006
May 28, 2006
694
695
req->port = port;
req->attribute = attribute;
May 28, 2006
May 28, 2006
697
/* READ THE REPLY */
May 29, 2006
May 29, 2006
699
700
701
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
702
703
return (XvBadReply);
}
May 28, 2006
May 28, 2006
705
*p_value = rep.value;
May 29, 2006
May 29, 2006
707
708
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
709
710
return (Success);
711
712
713
}
int
May 29, 2006
May 29, 2006
714
715
716
717
718
719
720
721
722
SDL_NAME(XvQueryBestSize) (Display * dpy,
XvPortID port,
Bool motion,
unsigned int vid_w,
unsigned int vid_h,
unsigned int drw_w,
unsigned int drw_h,
unsigned int *p_actual_width,
unsigned int *p_actual_height)
May 29, 2006
May 29, 2006
724
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
725
726
xvQueryBestSizeReq *req;
xvQueryBestSizeReply rep;
May 29, 2006
May 29, 2006
728
XvCheckExtension(dpy, info, XvBadExtension);
May 29, 2006
May 29, 2006
730
LockDisplay(dpy);
May 29, 2006
May 29, 2006
732
XvGetReq(QueryBestSize, req);
May 28, 2006
May 28, 2006
733
734
735
736
737
738
req->port = port;
req->motion = motion;
req->vid_w = vid_w;
req->vid_h = vid_h;
req->drw_w = drw_w;
req->drw_h = drw_h;
May 28, 2006
May 28, 2006
740
/* READ THE REPLY */
May 29, 2006
May 29, 2006
742
743
744
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
745
746
return (XvBadReply);
}
May 28, 2006
May 28, 2006
748
749
*p_actual_width = rep.actual_width;
*p_actual_height = rep.actual_height;
May 29, 2006
May 29, 2006
751
752
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
754
return (Success);
755
756
757
}
May 29, 2006
May 29, 2006
758
759
SDL_NAME(XvAttribute) *
SDL_NAME(XvQueryPortAttributes) (Display * dpy, XvPortID port, int *num)
May 29, 2006
May 29, 2006
761
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
762
763
xvQueryPortAttributesReq *req;
xvQueryPortAttributesReply rep;
May 29, 2006
May 29, 2006
764
SDL_NAME(XvAttribute) * ret = NULL;
May 28, 2006
May 28, 2006
765
766
767
*num = 0;
May 29, 2006
May 29, 2006
768
XvCheckExtension(dpy, info, NULL);
May 28, 2006
May 28, 2006
769
May 29, 2006
May 29, 2006
770
LockDisplay(dpy);
May 28, 2006
May 28, 2006
771
May 29, 2006
May 29, 2006
772
XvGetReq(QueryPortAttributes, req);
May 28, 2006
May 28, 2006
773
774
775
776
req->port = port;
/* READ THE REPLY */
May 29, 2006
May 29, 2006
777
778
779
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
780
781
782
783
784
return ret;
}
if (rep.num_attributes) {
int size =
May 29, 2006
May 29, 2006
785
(rep.num_attributes * sizeof(SDL_NAME(XvAttribute))) +
May 28, 2006
May 28, 2006
786
787
rep.text_size;
May 29, 2006
May 29, 2006
788
if ((ret = Xmalloc(size))) {
May 28, 2006
May 28, 2006
789
790
791
792
793
char *marker = (char *) (&ret[rep.num_attributes]);
xvAttributeInfo Info;
int i;
for (i = 0; i < rep.num_attributes; i++) {
May 29, 2006
May 29, 2006
794
_XRead(dpy, (char *) (&Info), sz_xvAttributeInfo);
May 28, 2006
May 28, 2006
795
796
797
798
ret[i].flags = (int) Info.flags;
ret[i].min_value = Info.min;
ret[i].max_value = Info.max;
ret[i].name = marker;
May 29, 2006
May 29, 2006
799
_XRead(dpy, marker, Info.size);
May 28, 2006
May 28, 2006
800
801
802
803
marker += Info.size;
(*num)++;
}
} else
May 29, 2006
May 29, 2006
804
_XEatData(dpy, rep.length << 2);
May 28, 2006
May 28, 2006
805
806
}
May 29, 2006
May 29, 2006
807
808
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
809
810
return ret;
811
812
}
May 29, 2006
May 29, 2006
813
814
815
SDL_NAME(XvImageFormatValues) * SDL_NAME(XvListImageFormats) (Display * dpy,
XvPortID port,
int *num)
May 28, 2006
May 28, 2006
816
{
May 29, 2006
May 29, 2006
817
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
818
819
xvListImageFormatsReq *req;
xvListImageFormatsReply rep;
May 29, 2006
May 29, 2006
820
SDL_NAME(XvImageFormatValues) * ret = NULL;
May 28, 2006
May 28, 2006
821
822
823
*num = 0;
May 29, 2006
May 29, 2006
824
XvCheckExtension(dpy, info, NULL);
May 28, 2006
May 28, 2006
825
May 29, 2006
May 29, 2006
826
LockDisplay(dpy);
May 28, 2006
May 28, 2006
827
May 29, 2006
May 29, 2006
828
XvGetReq(ListImageFormats, req);
May 28, 2006
May 28, 2006
829
830
831
832
req->port = port;
/* READ THE REPLY */
May 29, 2006
May 29, 2006
833
834
835
if (_XReply(dpy, (xReply *) & rep, 0, xFalse) == 0) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
836
837
838
839
return NULL;
}
if (rep.num_formats) {
May 29, 2006
May 29, 2006
840
int size = (rep.num_formats * sizeof(SDL_NAME(XvImageFormatValues)));
May 28, 2006
May 28, 2006
841
May 29, 2006
May 29, 2006
842
if ((ret = Xmalloc(size))) {
May 28, 2006
May 28, 2006
843
844
845
846
xvImageFormatInfo Info;
int i;
for (i = 0; i < rep.num_formats; i++) {
May 29, 2006
May 29, 2006
847
_XRead(dpy, (char *) (&Info), sz_xvImageFormatInfo);
May 28, 2006
May 28, 2006
848
849
850
ret[i].id = Info.id;
ret[i].type = Info.type;
ret[i].byte_order = Info.byte_order;
May 29, 2006
May 29, 2006
851
memcpy(&(ret[i].guid[0]), &(Info.guid[0]), 16);
May 28, 2006
May 28, 2006
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
ret[i].bits_per_pixel = Info.bpp;
ret[i].format = Info.format;
ret[i].num_planes = Info.num_planes;
ret[i].depth = Info.depth;
ret[i].red_mask = Info.red_mask;
ret[i].green_mask = Info.green_mask;
ret[i].blue_mask = Info.blue_mask;
ret[i].y_sample_bits = Info.y_sample_bits;
ret[i].u_sample_bits = Info.u_sample_bits;
ret[i].v_sample_bits = Info.v_sample_bits;
ret[i].horz_y_period = Info.horz_y_period;
ret[i].horz_u_period = Info.horz_u_period;
ret[i].horz_v_period = Info.horz_v_period;
ret[i].vert_y_period = Info.vert_y_period;
ret[i].vert_u_period = Info.vert_u_period;
ret[i].vert_v_period = Info.vert_v_period;
May 29, 2006
May 29, 2006
868
869
memcpy(&(ret[i].component_order[0]),
&(Info.comp_order[0]), 32);
May 28, 2006
May 28, 2006
870
871
872
873
ret[i].scanline_order = Info.scanline_order;
(*num)++;
}
} else
May 29, 2006
May 29, 2006
874
_XEatData(dpy, rep.length << 2);
May 28, 2006
May 28, 2006
875
876
}
May 29, 2006
May 29, 2006
877
878
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
879
880
return ret;
881
882
}
May 29, 2006
May 29, 2006
883
884
885
886
887
SDL_NAME(XvImage) * SDL_NAME(XvCreateImage) (Display * dpy,
XvPortID port,
int id,
char *data,
int width, int height)
May 28, 2006
May 28, 2006
888
{
May 29, 2006
May 29, 2006
889
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
890
891
xvQueryImageAttributesReq *req;
xvQueryImageAttributesReply rep;
May 29, 2006
May 29, 2006
892
SDL_NAME(XvImage) * ret = NULL;
May 28, 2006
May 28, 2006
893
May 29, 2006
May 29, 2006
894
XvCheckExtension(dpy, info, NULL);
May 28, 2006
May 28, 2006
895
May 29, 2006
May 29, 2006
896
LockDisplay(dpy);
May 28, 2006
May 28, 2006
897
May 29, 2006
May 29, 2006
898
XvGetReq(QueryImageAttributes, req);
May 28, 2006
May 28, 2006
899
900
901
902
903
904
905
req->id = id;
req->port = port;
req->width = width;
req->height = height;
/* READ THE REPLY */
May 29, 2006
May 29, 2006
906
907
908
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
909
910
911
912
return NULL;
}
if ((ret =
May 29, 2006
May 29, 2006
913
914
(SDL_NAME(XvImage) *) Xmalloc(sizeof(SDL_NAME(XvImage)) +
(rep.num_planes << 3)))) {
May 28, 2006
May 28, 2006
915
916
917
918
919
920
921
922
923
ret->id = id;
ret->width = rep.width;
ret->height = rep.height;
ret->data_size = rep.data_size;
ret->num_planes = rep.num_planes;
ret->pitches = (int *) (&ret[1]);
ret->offsets = ret->pitches + rep.num_planes;
ret->data = data;
ret->obdata = NULL;
May 29, 2006
May 29, 2006
924
925
_XRead(dpy, (char *) (ret->pitches), rep.num_planes << 2);
_XRead(dpy, (char *) (ret->offsets), rep.num_planes << 2);
May 28, 2006
May 28, 2006
926
} else
May 29, 2006
May 29, 2006
927
_XEatData(dpy, rep.length << 2);
May 28, 2006
May 28, 2006
928
May 29, 2006
May 29, 2006
929
930
UnlockDisplay(dpy);
SyncHandle();
May 28, 2006
May 28, 2006
931
return ret;
932
933
}
May 29, 2006
May 29, 2006
934
935
936
937
938
939
940
SDL_NAME(XvImage) * SDL_NAME(XvShmCreateImage) (Display * dpy,
XvPortID port,
int id,
char *data,
int width,
int height,
XShmSegmentInfo * shminfo)
May 28, 2006
May 28, 2006
941
{
May 29, 2006
May 29, 2006
942
SDL_NAME(XvImage) * ret;
May 29, 2006
May 29, 2006
944
ret = SDL_NAME(XvCreateImage) (dpy, port, id, data, width, height);
May 28, 2006
May 28, 2006
946
947
if (ret)
ret->obdata = (XPointer) shminfo;
May 28, 2006
May 28, 2006
949
return ret;
950
951
}
May 29, 2006
May 29, 2006
952
953
954
955
956
957
958
959
960
961
962
963
int SDL_NAME(XvPutImage) (Display * dpy,
XvPortID port,
Drawable d,
GC gc,
SDL_NAME(XvImage) * image,
int src_x,
int src_y,
unsigned int src_w,
unsigned int src_h,
int dest_x,
int dest_y,
unsigned int dest_w, unsigned int dest_h)
May 28, 2006
May 28, 2006
964
{
May 29, 2006
May 29, 2006
965
XExtDisplayInfo *info = xv_find_display(dpy);
May 28, 2006
May 28, 2006
966
967
968
xvPutImageReq *req;
int len;
May 29, 2006
May 29, 2006
969
XvCheckExtension(dpy, info, XvBadExtension);
May 28, 2006
May 28, 2006
970
May 29, 2006
May 29, 2006
971
LockDisplay(dpy);
May 28, 2006
May 28, 2006
972
May 29, 2006
May 29, 2006
973
FlushGC(dpy, gc);
May 28, 2006
May 28, 2006
974
May 29, 2006
May 29, 2006
975
XvGetReq(PutImage, req);
May 28, 2006
May 28, 2006
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
req->port = port;
req->drawable = d;
req->gc = gc->gid;
req->id = image->id;
req->src_x = src_x;
req->src_y = src_y;
req->src_w = src_w;
req->src_h = src_h;
req->drw_x = dest_x;
req->drw_y = dest_y;
req->drw_w = dest_w;
req->drw_h = dest_h;
req->width = image->width;
req->height = image->height;
len = (image->data_size + 3) >> 2;
May 29, 2006
May 29, 2006
993
SetReqLen(req, len, len);
May 28, 2006
May 28, 2006
994
995
996
997
998
/* Yes it's kindof lame that we are sending the whole thing,
but for video all of it may be needed even if displaying
only a subsection, and I don't want to go through the
trouble of creating subregions to send */
May 29, 2006
May 29, 2006
999
Data(dpy, (char *) image->data, image->data_size);
May 28, 2006
May 28, 2006
1000