Xv.c revision 9f606849
19f606849Smrg/*********************************************************** 29f606849SmrgCopyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts, 39f606849Smrgand the Massachusetts Institute of Technology, Cambridge, Massachusetts. 49f606849Smrg 59f606849Smrg All Rights Reserved 69f606849Smrg 79f606849SmrgPermission to use, copy, modify, and distribute this software and its 89f606849Smrgdocumentation for any purpose and without fee is hereby granted, 99f606849Smrgprovided that the above copyright notice appear in all copies and that 109f606849Smrgboth that copyright notice and this permission notice appear in 119f606849Smrgsupporting documentation, and that the names of Digital or MIT not be 129f606849Smrgused in advertising or publicity pertaining to distribution of the 139f606849Smrgsoftware without specific, written prior permission. 149f606849Smrg 159f606849SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 169f606849SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 179f606849SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 189f606849SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 199f606849SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 209f606849SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 219f606849SmrgSOFTWARE. 229f606849Smrg 239f606849Smrg******************************************************************/ 249f606849Smrg/* $XFree86: xc/lib/Xv/Xv.c,v 1.17 2003/04/28 16:56:27 dawes Exp $ */ 259f606849Smrg/* $XdotOrg: xc/lib/Xv/Xv.c,v 1.2 2004/04/23 18:43:55 eich Exp $ */ 269f606849Smrg/* 279f606849Smrg** File: 289f606849Smrg** 299f606849Smrg** Xv.c --- Xv library extension module. 309f606849Smrg** 319f606849Smrg** Author: 329f606849Smrg** 339f606849Smrg** David Carver (Digital Workstation Engineering/Project Athena) 349f606849Smrg** 359f606849Smrg** Revisions: 369f606849Smrg** 379f606849Smrg** 26.06.91 Carver 389f606849Smrg** - changed XvFreeAdaptors to XvFreeAdaptorInfo 399f606849Smrg** - changed XvFreeEncodings to XvFreeEncodingInfo 409f606849Smrg** 419f606849Smrg** 11.06.91 Carver 429f606849Smrg** - changed SetPortControl to SetPortAttribute 439f606849Smrg** - changed GetPortControl to GetPortAttribute 449f606849Smrg** - changed QueryBestSize 459f606849Smrg** 469f606849Smrg** 15.05.91 Carver 479f606849Smrg** - version 2.0 upgrade 489f606849Smrg** 499f606849Smrg** 240.01.91 Carver 509f606849Smrg** - version 1.4 upgrade 519f606849Smrg** 529f606849Smrg*/ 539f606849Smrg 549f606849Smrg#include <stdio.h> 559f606849Smrg#include "Xvlibint.h" 569f606849Smrg#include <X11/extensions/Xext.h> 579f606849Smrg#include <X11/extensions/extutil.h> 589f606849Smrg#include <X11/extensions/XShm.h> 599f606849Smrg 609f606849Smrgstatic XExtensionInfo _xv_info_data; 619f606849Smrgstatic XExtensionInfo *xv_info = &_xv_info_data; 629f606849Smrgstatic char *xv_extension_name = XvName; 639f606849Smrg 649f606849Smrg#define XvCheckExtension(dpy, i, val) \ 659f606849Smrg XextCheckExtension(dpy, i, xv_extension_name, val) 669f606849Smrg 679f606849Smrgstatic char *xv_error_string(Display *dpy, int code, XExtCodes *codes, 689f606849Smrg char * buf, int n); 699f606849Smrgstatic int xv_close_display(Display *dpy, XExtCodes *codes); 709f606849Smrgstatic Bool xv_wire_to_event(Display *dpy, XEvent *host, xEvent *wire); 719f606849Smrg 729f606849Smrgstatic XExtensionHooks xv_extension_hooks = { 739f606849Smrg NULL, /* create_gc */ 749f606849Smrg NULL, /* copy_gc */ 759f606849Smrg NULL, /* flush_gc */ 769f606849Smrg NULL, /* free_gc */ 779f606849Smrg NULL, /* create_font */ 789f606849Smrg NULL, /* free_font */ 799f606849Smrg xv_close_display, /* close_display */ 809f606849Smrg xv_wire_to_event, /* wire_to_event */ 819f606849Smrg NULL, /* event_to_wire */ 829f606849Smrg NULL, /* error */ 839f606849Smrg xv_error_string /* error_string */ 849f606849Smrg}; 859f606849Smrg 869f606849Smrg 879f606849Smrgstatic char *xv_error_list[] = 889f606849Smrg{ 899f606849Smrg "BadPort", /* XvBadPort */ 909f606849Smrg "BadEncoding", /* XvBadEncoding */ 919f606849Smrg "BadControl" /* XvBadControl */ 929f606849Smrg}; 939f606849Smrg 949f606849Smrgstatic XEXT_GENERATE_CLOSE_DISPLAY (xv_close_display, xv_info) 959f606849Smrg 969f606849Smrg 979f606849Smrgstatic XEXT_GENERATE_FIND_DISPLAY (xv_find_display, xv_info, 989f606849Smrg xv_extension_name, 999f606849Smrg &xv_extension_hooks, 1009f606849Smrg XvNumEvents, NULL) 1019f606849Smrg 1029f606849Smrg 1039f606849Smrgstatic XEXT_GENERATE_ERROR_STRING (xv_error_string, xv_extension_name, 1049f606849Smrg XvNumErrors, xv_error_list) 1059f606849Smrg 1069f606849Smrg 1079f606849Smrgint 1089f606849SmrgXvQueryExtension( 1099f606849Smrg Display *dpy, 1109f606849Smrg unsigned int *p_version, 1119f606849Smrg unsigned int *p_revision, 1129f606849Smrg unsigned int *p_requestBase, 1139f606849Smrg unsigned int *p_eventBase, 1149f606849Smrg unsigned int *p_errorBase 1159f606849Smrg){ 1169f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 1179f606849Smrg xvQueryExtensionReq *req; 1189f606849Smrg xvQueryExtensionReply rep; 1199f606849Smrg 1209f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 1219f606849Smrg 1229f606849Smrg LockDisplay(dpy); 1239f606849Smrg 1249f606849Smrg XvGetReq(QueryExtension, req); 1259f606849Smrg 1269f606849Smrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 1279f606849Smrg UnlockDisplay(dpy); 1289f606849Smrg SyncHandle(); 1299f606849Smrg return XvBadExtension; 1309f606849Smrg } 1319f606849Smrg 1329f606849Smrg *p_version = rep.version; 1339f606849Smrg *p_revision = rep.revision; 1349f606849Smrg *p_requestBase = info->codes->major_opcode; 1359f606849Smrg *p_eventBase = info->codes->first_event; 1369f606849Smrg *p_errorBase = info->codes->first_error; 1379f606849Smrg 1389f606849Smrg UnlockDisplay(dpy); 1399f606849Smrg SyncHandle(); 1409f606849Smrg 1419f606849Smrg return Success; 1429f606849Smrg} 1439f606849Smrg 1449f606849Smrgint 1459f606849SmrgXvQueryAdaptors( 1469f606849Smrg Display *dpy, 1479f606849Smrg Window window, 1489f606849Smrg unsigned int *p_nAdaptors, 1499f606849Smrg XvAdaptorInfo **p_pAdaptors 1509f606849Smrg){ 1519f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 1529f606849Smrg xvQueryAdaptorsReq *req; 1539f606849Smrg xvQueryAdaptorsReply rep; 1549f606849Smrg int size,ii,jj; 1559f606849Smrg char *name; 1569f606849Smrg XvAdaptorInfo *pas, *pa; 1579f606849Smrg XvFormat *pfs, *pf; 1589f606849Smrg char *buffer; 1599f606849Smrg union 1609f606849Smrg { 1619f606849Smrg char *buffer; 1629f606849Smrg char *string; 1639f606849Smrg xvAdaptorInfo *pa; 1649f606849Smrg xvFormat *pf; 1659f606849Smrg } u; 1669f606849Smrg 1679f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 1689f606849Smrg 1699f606849Smrg LockDisplay(dpy); 1709f606849Smrg 1719f606849Smrg XvGetReq(QueryAdaptors, req); 1729f606849Smrg req->window = window; 1739f606849Smrg 1749f606849Smrg /* READ THE REPLY */ 1759f606849Smrg 1769f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 1779f606849Smrg UnlockDisplay(dpy); 1789f606849Smrg SyncHandle(); 1799f606849Smrg return(XvBadReply); 1809f606849Smrg } 1819f606849Smrg 1829f606849Smrg size = rep.length << 2; 1839f606849Smrg if ( (buffer = (char *)Xmalloc ((unsigned) size)) == NULL) { 1849f606849Smrg UnlockDisplay(dpy); 1859f606849Smrg SyncHandle(); 1869f606849Smrg return(XvBadAlloc); 1879f606849Smrg } 1889f606849Smrg _XRead (dpy, buffer, size); 1899f606849Smrg 1909f606849Smrg u.buffer = buffer; 1919f606849Smrg 1929f606849Smrg /* GET INPUT ADAPTORS */ 1939f606849Smrg 1949f606849Smrg if (rep.num_adaptors == 0) { 1959f606849Smrg pas = NULL; 1969f606849Smrg } else { 1979f606849Smrg size = rep.num_adaptors*sizeof(XvAdaptorInfo); 1989f606849Smrg if ((pas=(XvAdaptorInfo *)Xmalloc(size))==NULL) { 1999f606849Smrg Xfree(buffer); 2009f606849Smrg UnlockDisplay(dpy); 2019f606849Smrg SyncHandle(); 2029f606849Smrg return(XvBadAlloc); 2039f606849Smrg } 2049f606849Smrg } 2059f606849Smrg 2069f606849Smrg /* INIT ADAPTOR FIELDS */ 2079f606849Smrg 2089f606849Smrg pa = pas; 2099f606849Smrg for (ii=0; ii<rep.num_adaptors; ii++) { 2109f606849Smrg pa->num_adaptors = 0; 2119f606849Smrg pa->name = (char *)NULL; 2129f606849Smrg pa->formats = (XvFormat *)NULL; 2139f606849Smrg pa++; 2149f606849Smrg } 2159f606849Smrg 2169f606849Smrg pa = pas; 2179f606849Smrg for (ii=0; ii<rep.num_adaptors; ii++) { 2189f606849Smrg pa->type = u.pa->type; 2199f606849Smrg pa->base_id = u.pa->base_id; 2209f606849Smrg pa->num_ports = u.pa->num_ports; 2219f606849Smrg pa->num_formats = u.pa->num_formats; 2229f606849Smrg pa->num_adaptors = rep.num_adaptors - ii; 2239f606849Smrg 2249f606849Smrg /* GET ADAPTOR NAME */ 2259f606849Smrg 2269f606849Smrg size = u.pa->name_size; 2279f606849Smrg u.buffer += (sz_xvAdaptorInfo + 3) & ~3; 2289f606849Smrg 2299f606849Smrg if ( (name = (char *)Xmalloc(size+1)) == NULL) 2309f606849Smrg { 2319f606849Smrg XvFreeAdaptorInfo(pas); 2329f606849Smrg Xfree(buffer); 2339f606849Smrg UnlockDisplay(dpy); 2349f606849Smrg SyncHandle(); 2359f606849Smrg return(XvBadAlloc); 2369f606849Smrg } 2379f606849Smrg (void)strncpy(name, u.string, size); 2389f606849Smrg name[size] = '\0'; 2399f606849Smrg pa->name = name; 2409f606849Smrg 2419f606849Smrg u.buffer += (size + 3) & ~3; 2429f606849Smrg 2439f606849Smrg /* GET FORMATS */ 2449f606849Smrg 2459f606849Smrg size = pa->num_formats*sizeof(XvFormat); 2469f606849Smrg if ((pfs=(XvFormat *)Xmalloc(size))==NULL) { 2479f606849Smrg XvFreeAdaptorInfo(pas); 2489f606849Smrg Xfree(buffer); 2499f606849Smrg UnlockDisplay(dpy); 2509f606849Smrg SyncHandle(); 2519f606849Smrg return(XvBadAlloc); 2529f606849Smrg } 2539f606849Smrg 2549f606849Smrg pf = pfs; 2559f606849Smrg for (jj=0; jj<pa->num_formats; jj++) { 2569f606849Smrg pf->depth = u.pf->depth; 2579f606849Smrg pf->visual_id = u.pf->visual; 2589f606849Smrg pf++; 2599f606849Smrg 2609f606849Smrg u.buffer += (sz_xvFormat + 3) & ~3; 2619f606849Smrg } 2629f606849Smrg 2639f606849Smrg pa->formats = pfs; 2649f606849Smrg 2659f606849Smrg pa++; 2669f606849Smrg 2679f606849Smrg } 2689f606849Smrg 2699f606849Smrg *p_nAdaptors = rep.num_adaptors; 2709f606849Smrg *p_pAdaptors = pas; 2719f606849Smrg 2729f606849Smrg Xfree(buffer); 2739f606849Smrg UnlockDisplay(dpy); 2749f606849Smrg SyncHandle(); 2759f606849Smrg 2769f606849Smrg return (Success); 2779f606849Smrg} 2789f606849Smrg 2799f606849Smrg 2809f606849Smrgvoid 2819f606849SmrgXvFreeAdaptorInfo(XvAdaptorInfo *pAdaptors) 2829f606849Smrg{ 2839f606849Smrg 2849f606849Smrg XvAdaptorInfo *pa; 2859f606849Smrg int ii; 2869f606849Smrg 2879f606849Smrg if (!pAdaptors) return; 2889f606849Smrg 2899f606849Smrg pa = pAdaptors; 2909f606849Smrg 2919f606849Smrg for (ii=0; ii<pAdaptors->num_adaptors; ii++, pa++) 2929f606849Smrg { 2939f606849Smrg if (pa->name) 2949f606849Smrg { 2959f606849Smrg Xfree(pa->name); 2969f606849Smrg } 2979f606849Smrg if (pa->formats) 2989f606849Smrg { 2999f606849Smrg Xfree(pa->formats); 3009f606849Smrg } 3019f606849Smrg } 3029f606849Smrg 3039f606849Smrg Xfree(pAdaptors); 3049f606849Smrg} 3059f606849Smrg 3069f606849Smrgint 3079f606849SmrgXvQueryEncodings( 3089f606849Smrg Display *dpy, 3099f606849Smrg XvPortID port, 3109f606849Smrg unsigned int *p_nEncodings, 3119f606849Smrg XvEncodingInfo **p_pEncodings 3129f606849Smrg){ 3139f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 3149f606849Smrg xvQueryEncodingsReq *req; 3159f606849Smrg xvQueryEncodingsReply rep; 3169f606849Smrg int size, jj; 3179f606849Smrg char *name; 3189f606849Smrg XvEncodingInfo *pes, *pe; 3199f606849Smrg char *buffer; 3209f606849Smrg union 3219f606849Smrg { 3229f606849Smrg char *buffer; 3239f606849Smrg char *string; 3249f606849Smrg xvEncodingInfo *pe; 3259f606849Smrg } u; 3269f606849Smrg 3279f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 3289f606849Smrg 3299f606849Smrg LockDisplay(dpy); 3309f606849Smrg 3319f606849Smrg XvGetReq(QueryEncodings, req); 3329f606849Smrg req->port = port; 3339f606849Smrg 3349f606849Smrg /* READ THE REPLY */ 3359f606849Smrg 3369f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 3379f606849Smrg UnlockDisplay(dpy); 3389f606849Smrg SyncHandle(); 3399f606849Smrg return(XvBadReply); 3409f606849Smrg } 3419f606849Smrg 3429f606849Smrg size = rep.length << 2; 3439f606849Smrg if ( (buffer = (char *)Xmalloc ((unsigned) size)) == NULL) { 3449f606849Smrg UnlockDisplay(dpy); 3459f606849Smrg SyncHandle(); 3469f606849Smrg return(XvBadAlloc); 3479f606849Smrg } 3489f606849Smrg _XRead (dpy, buffer, size); 3499f606849Smrg 3509f606849Smrg u.buffer = buffer; 3519f606849Smrg 3529f606849Smrg /* GET ENCODINGS */ 3539f606849Smrg 3549f606849Smrg size = rep.num_encodings*sizeof(XvEncodingInfo); 3559f606849Smrg if ( (pes = (XvEncodingInfo *)Xmalloc(size)) == NULL) { 3569f606849Smrg Xfree(buffer); 3579f606849Smrg UnlockDisplay(dpy); 3589f606849Smrg SyncHandle(); 3599f606849Smrg return(XvBadAlloc); 3609f606849Smrg } 3619f606849Smrg 3629f606849Smrg /* INITIALIZE THE ENCODING POINTER */ 3639f606849Smrg 3649f606849Smrg pe = pes; 3659f606849Smrg for (jj=0; jj<rep.num_encodings; jj++) { 3669f606849Smrg pe->name = (char *)NULL; 3679f606849Smrg pe->num_encodings = 0; 3689f606849Smrg pe++; 3699f606849Smrg } 3709f606849Smrg 3719f606849Smrg pe = pes; 3729f606849Smrg for (jj=0; jj<rep.num_encodings; jj++) { 3739f606849Smrg pe->encoding_id = u.pe->encoding; 3749f606849Smrg pe->width = u.pe->width; 3759f606849Smrg pe->height = u.pe->height; 3769f606849Smrg pe->rate.numerator = u.pe->rate.numerator; 3779f606849Smrg pe->rate.denominator = u.pe->rate.denominator; 3789f606849Smrg pe->num_encodings = rep.num_encodings - jj; 3799f606849Smrg 3809f606849Smrg size = u.pe->name_size; 3819f606849Smrg u.buffer += (sz_xvEncodingInfo + 3) & ~3; 3829f606849Smrg 3839f606849Smrg if ( (name = (char *)Xmalloc(size+1)) == NULL) { 3849f606849Smrg XvFreeEncodingInfo(pes); 3859f606849Smrg Xfree(buffer); 3869f606849Smrg UnlockDisplay(dpy); 3879f606849Smrg SyncHandle(); 3889f606849Smrg return(XvBadAlloc); 3899f606849Smrg } 3909f606849Smrg strncpy(name, u.string, size); 3919f606849Smrg name[size] = '\0'; 3929f606849Smrg pe->name = name; 3939f606849Smrg pe++; 3949f606849Smrg 3959f606849Smrg u.buffer += (size + 3) & ~3; 3969f606849Smrg } 3979f606849Smrg 3989f606849Smrg *p_nEncodings = rep.num_encodings; 3999f606849Smrg *p_pEncodings = pes; 4009f606849Smrg 4019f606849Smrg Xfree(buffer); 4029f606849Smrg UnlockDisplay(dpy); 4039f606849Smrg SyncHandle(); 4049f606849Smrg 4059f606849Smrg return (Success); 4069f606849Smrg} 4079f606849Smrg 4089f606849Smrgvoid 4099f606849SmrgXvFreeEncodingInfo(XvEncodingInfo *pEncodings) 4109f606849Smrg{ 4119f606849Smrg 4129f606849Smrg XvEncodingInfo *pe; 4139f606849Smrg int ii; 4149f606849Smrg 4159f606849Smrg if (!pEncodings) return; 4169f606849Smrg 4179f606849Smrg pe = pEncodings; 4189f606849Smrg 4199f606849Smrg for (ii=0; ii<pEncodings->num_encodings; ii++, pe++) { 4209f606849Smrg if (pe->name) Xfree(pe->name); 4219f606849Smrg } 4229f606849Smrg 4239f606849Smrg Xfree(pEncodings); 4249f606849Smrg} 4259f606849Smrg 4269f606849Smrgint 4279f606849SmrgXvPutVideo( 4289f606849Smrg Display *dpy, 4299f606849Smrg XvPortID port, 4309f606849Smrg Drawable d, 4319f606849Smrg GC gc, 4329f606849Smrg int vx, int vy, 4339f606849Smrg unsigned int vw, unsigned int vh, 4349f606849Smrg int dx, int dy, 4359f606849Smrg unsigned int dw, unsigned int dh 4369f606849Smrg){ 4379f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 4389f606849Smrg xvPutVideoReq *req; 4399f606849Smrg 4409f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 4419f606849Smrg 4429f606849Smrg LockDisplay(dpy); 4439f606849Smrg 4449f606849Smrg FlushGC(dpy, gc); 4459f606849Smrg 4469f606849Smrg XvGetReq(PutVideo, req); 4479f606849Smrg 4489f606849Smrg req->port = port; 4499f606849Smrg req->drawable = d; 4509f606849Smrg req->gc = gc->gid; 4519f606849Smrg req->vid_x = vx; 4529f606849Smrg req->vid_y = vy; 4539f606849Smrg req->vid_w = vw; 4549f606849Smrg req->vid_h = vh; 4559f606849Smrg req->drw_x = dx; 4569f606849Smrg req->drw_y = dy; 4579f606849Smrg req->drw_w = dw; 4589f606849Smrg req->drw_h = dh; 4599f606849Smrg 4609f606849Smrg UnlockDisplay(dpy); 4619f606849Smrg SyncHandle(); 4629f606849Smrg 4639f606849Smrg return Success; 4649f606849Smrg} 4659f606849Smrg 4669f606849Smrgint 4679f606849SmrgXvPutStill( 4689f606849Smrg Display *dpy, 4699f606849Smrg XvPortID port, 4709f606849Smrg Drawable d, 4719f606849Smrg GC gc, 4729f606849Smrg int vx, int vy, 4739f606849Smrg unsigned int vw, unsigned int vh, 4749f606849Smrg int dx, int dy, 4759f606849Smrg unsigned int dw, unsigned int dh 4769f606849Smrg){ 4779f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 4789f606849Smrg xvPutStillReq *req; 4799f606849Smrg 4809f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 4819f606849Smrg 4829f606849Smrg LockDisplay(dpy); 4839f606849Smrg 4849f606849Smrg FlushGC(dpy, gc); 4859f606849Smrg 4869f606849Smrg XvGetReq(PutStill, req); 4879f606849Smrg req->port = port; 4889f606849Smrg req->drawable = d; 4899f606849Smrg req->gc = gc->gid; 4909f606849Smrg req->vid_x = vx; 4919f606849Smrg req->vid_y = vy; 4929f606849Smrg req->vid_w = vw; 4939f606849Smrg req->vid_h = vh; 4949f606849Smrg req->drw_x = dx; 4959f606849Smrg req->drw_y = dy; 4969f606849Smrg req->drw_w = dw; 4979f606849Smrg req->drw_h = dh; 4989f606849Smrg 4999f606849Smrg UnlockDisplay(dpy); 5009f606849Smrg SyncHandle(); 5019f606849Smrg 5029f606849Smrg return Success; 5039f606849Smrg} 5049f606849Smrg 5059f606849Smrgint 5069f606849SmrgXvGetVideo( 5079f606849Smrg Display *dpy, 5089f606849Smrg XvPortID port, 5099f606849Smrg Drawable d, 5109f606849Smrg GC gc, 5119f606849Smrg int vx, int vy, 5129f606849Smrg unsigned int vw, unsigned int vh, 5139f606849Smrg int dx, int dy, 5149f606849Smrg unsigned int dw, unsigned int dh 5159f606849Smrg){ 5169f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 5179f606849Smrg xvGetVideoReq *req; 5189f606849Smrg 5199f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 5209f606849Smrg 5219f606849Smrg LockDisplay(dpy); 5229f606849Smrg 5239f606849Smrg FlushGC(dpy, gc); 5249f606849Smrg 5259f606849Smrg XvGetReq(GetVideo, req); 5269f606849Smrg req->port = port; 5279f606849Smrg req->drawable = d; 5289f606849Smrg req->gc = gc->gid; 5299f606849Smrg req->vid_x = vx; 5309f606849Smrg req->vid_y = vy; 5319f606849Smrg req->vid_w = vw; 5329f606849Smrg req->vid_h = vh; 5339f606849Smrg req->drw_x = dx; 5349f606849Smrg req->drw_y = dy; 5359f606849Smrg req->drw_w = dw; 5369f606849Smrg req->drw_h = dh; 5379f606849Smrg 5389f606849Smrg UnlockDisplay(dpy); 5399f606849Smrg SyncHandle(); 5409f606849Smrg 5419f606849Smrg return Success; 5429f606849Smrg} 5439f606849Smrg 5449f606849Smrgint 5459f606849SmrgXvGetStill( 5469f606849Smrg Display *dpy, 5479f606849Smrg XvPortID port, 5489f606849Smrg Drawable d, 5499f606849Smrg GC gc, 5509f606849Smrg int vx, int vy, 5519f606849Smrg unsigned int vw, unsigned int vh, 5529f606849Smrg int dx, int dy, 5539f606849Smrg unsigned int dw, unsigned int dh 5549f606849Smrg){ 5559f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 5569f606849Smrg xvGetStillReq *req; 5579f606849Smrg 5589f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 5599f606849Smrg 5609f606849Smrg LockDisplay(dpy); 5619f606849Smrg 5629f606849Smrg FlushGC(dpy, gc); 5639f606849Smrg 5649f606849Smrg XvGetReq(GetStill, req); 5659f606849Smrg req->port = port; 5669f606849Smrg req->drawable = d; 5679f606849Smrg req->gc = gc->gid; 5689f606849Smrg req->vid_x = vx; 5699f606849Smrg req->vid_y = vy; 5709f606849Smrg req->vid_w = vw; 5719f606849Smrg req->vid_h = vh; 5729f606849Smrg req->drw_x = dx; 5739f606849Smrg req->drw_y = dy; 5749f606849Smrg req->drw_w = dw; 5759f606849Smrg req->drw_h = dh; 5769f606849Smrg 5779f606849Smrg UnlockDisplay(dpy); 5789f606849Smrg SyncHandle(); 5799f606849Smrg 5809f606849Smrg return Success; 5819f606849Smrg} 5829f606849Smrg 5839f606849Smrgint 5849f606849SmrgXvStopVideo( 5859f606849Smrg Display *dpy, 5869f606849Smrg XvPortID port, 5879f606849Smrg Drawable draw 5889f606849Smrg){ 5899f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 5909f606849Smrg xvStopVideoReq *req; 5919f606849Smrg 5929f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 5939f606849Smrg 5949f606849Smrg LockDisplay(dpy); 5959f606849Smrg 5969f606849Smrg XvGetReq(StopVideo, req); 5979f606849Smrg req->port = port; 5989f606849Smrg req->drawable = draw; 5999f606849Smrg 6009f606849Smrg UnlockDisplay(dpy); 6019f606849Smrg SyncHandle(); 6029f606849Smrg 6039f606849Smrg return Success; 6049f606849Smrg} 6059f606849Smrg 6069f606849Smrgint 6079f606849SmrgXvGrabPort( 6089f606849Smrg Display *dpy, 6099f606849Smrg XvPortID port, 6109f606849Smrg Time time 6119f606849Smrg){ 6129f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 6139f606849Smrg int result; 6149f606849Smrg xvGrabPortReply rep; 6159f606849Smrg xvGrabPortReq *req; 6169f606849Smrg 6179f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 6189f606849Smrg 6199f606849Smrg LockDisplay(dpy); 6209f606849Smrg 6219f606849Smrg XvGetReq(GrabPort, req); 6229f606849Smrg req->port = port; 6239f606849Smrg req->time = time; 6249f606849Smrg 6259f606849Smrg if (_XReply (dpy, (xReply *) &rep, 0, xTrue) == 0) 6269f606849Smrg rep.result = GrabSuccess; 6279f606849Smrg 6289f606849Smrg result = rep.result; 6299f606849Smrg 6309f606849Smrg UnlockDisplay(dpy); 6319f606849Smrg SyncHandle(); 6329f606849Smrg 6339f606849Smrg return result; 6349f606849Smrg} 6359f606849Smrg 6369f606849Smrgint 6379f606849SmrgXvUngrabPort( 6389f606849Smrg Display *dpy, 6399f606849Smrg XvPortID port, 6409f606849Smrg Time time 6419f606849Smrg){ 6429f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 6439f606849Smrg xvUngrabPortReq *req; 6449f606849Smrg 6459f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 6469f606849Smrg 6479f606849Smrg LockDisplay(dpy); 6489f606849Smrg 6499f606849Smrg XvGetReq(UngrabPort, req); 6509f606849Smrg req->port = port; 6519f606849Smrg req->time = time; 6529f606849Smrg 6539f606849Smrg UnlockDisplay(dpy); 6549f606849Smrg SyncHandle(); 6559f606849Smrg 6569f606849Smrg return Success; 6579f606849Smrg} 6589f606849Smrg 6599f606849Smrgint 6609f606849SmrgXvSelectVideoNotify( 6619f606849Smrg Display *dpy, 6629f606849Smrg Drawable drawable, 6639f606849Smrg Bool onoff 6649f606849Smrg){ 6659f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 6669f606849Smrg xvSelectVideoNotifyReq *req; 6679f606849Smrg 6689f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 6699f606849Smrg 6709f606849Smrg LockDisplay(dpy); 6719f606849Smrg 6729f606849Smrg XvGetReq(SelectVideoNotify, req); 6739f606849Smrg req->drawable = drawable; 6749f606849Smrg req->onoff = onoff; 6759f606849Smrg 6769f606849Smrg UnlockDisplay(dpy); 6779f606849Smrg SyncHandle(); 6789f606849Smrg 6799f606849Smrg return Success; 6809f606849Smrg} 6819f606849Smrg 6829f606849Smrgint 6839f606849SmrgXvSelectPortNotify( 6849f606849Smrg Display *dpy, 6859f606849Smrg XvPortID port, 6869f606849Smrg Bool onoff 6879f606849Smrg){ 6889f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 6899f606849Smrg xvSelectPortNotifyReq *req; 6909f606849Smrg 6919f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 6929f606849Smrg 6939f606849Smrg LockDisplay(dpy); 6949f606849Smrg 6959f606849Smrg XvGetReq(SelectPortNotify, req); 6969f606849Smrg req->port = port; 6979f606849Smrg req->onoff = onoff; 6989f606849Smrg 6999f606849Smrg UnlockDisplay(dpy); 7009f606849Smrg SyncHandle(); 7019f606849Smrg 7029f606849Smrg return Success; 7039f606849Smrg} 7049f606849Smrg 7059f606849Smrgint 7069f606849SmrgXvSetPortAttribute ( 7079f606849Smrg Display *dpy, 7089f606849Smrg XvPortID port, 7099f606849Smrg Atom attribute, 7109f606849Smrg int value 7119f606849Smrg) 7129f606849Smrg{ 7139f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 7149f606849Smrg xvSetPortAttributeReq *req; 7159f606849Smrg 7169f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 7179f606849Smrg 7189f606849Smrg LockDisplay(dpy); 7199f606849Smrg 7209f606849Smrg XvGetReq(SetPortAttribute, req); 7219f606849Smrg req->port = port; 7229f606849Smrg req->attribute = attribute; 7239f606849Smrg req->value = value; 7249f606849Smrg 7259f606849Smrg UnlockDisplay(dpy); 7269f606849Smrg SyncHandle(); 7279f606849Smrg 7289f606849Smrg return (Success); 7299f606849Smrg} 7309f606849Smrg 7319f606849Smrgint 7329f606849SmrgXvGetPortAttribute ( 7339f606849Smrg Display *dpy, 7349f606849Smrg XvPortID port, 7359f606849Smrg Atom attribute, 7369f606849Smrg int *p_value 7379f606849Smrg) 7389f606849Smrg{ 7399f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 7409f606849Smrg xvGetPortAttributeReq *req; 7419f606849Smrg xvGetPortAttributeReply rep; 7429f606849Smrg 7439f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 7449f606849Smrg 7459f606849Smrg LockDisplay(dpy); 7469f606849Smrg 7479f606849Smrg XvGetReq(GetPortAttribute, req); 7489f606849Smrg req->port = port; 7499f606849Smrg req->attribute = attribute; 7509f606849Smrg 7519f606849Smrg /* READ THE REPLY */ 7529f606849Smrg 7539f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 7549f606849Smrg UnlockDisplay(dpy); 7559f606849Smrg SyncHandle(); 7569f606849Smrg return(XvBadReply); 7579f606849Smrg } 7589f606849Smrg 7599f606849Smrg *p_value = rep.value; 7609f606849Smrg 7619f606849Smrg UnlockDisplay(dpy); 7629f606849Smrg SyncHandle(); 7639f606849Smrg 7649f606849Smrg return (Success); 7659f606849Smrg} 7669f606849Smrg 7679f606849Smrgint 7689f606849SmrgXvQueryBestSize( 7699f606849Smrg Display *dpy, 7709f606849Smrg XvPortID port, 7719f606849Smrg Bool motion, 7729f606849Smrg unsigned int vid_w, 7739f606849Smrg unsigned int vid_h, 7749f606849Smrg unsigned int drw_w, 7759f606849Smrg unsigned int drw_h, 7769f606849Smrg unsigned int *p_actual_width, 7779f606849Smrg unsigned int *p_actual_height 7789f606849Smrg) 7799f606849Smrg{ 7809f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 7819f606849Smrg xvQueryBestSizeReq *req; 7829f606849Smrg xvQueryBestSizeReply rep; 7839f606849Smrg 7849f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 7859f606849Smrg 7869f606849Smrg LockDisplay(dpy); 7879f606849Smrg 7889f606849Smrg XvGetReq(QueryBestSize, req); 7899f606849Smrg req->port = port; 7909f606849Smrg req->motion = motion; 7919f606849Smrg req->vid_w = vid_w; 7929f606849Smrg req->vid_h = vid_h; 7939f606849Smrg req->drw_w = drw_w; 7949f606849Smrg req->drw_h = drw_h; 7959f606849Smrg 7969f606849Smrg /* READ THE REPLY */ 7979f606849Smrg 7989f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 7999f606849Smrg UnlockDisplay(dpy); 8009f606849Smrg SyncHandle(); 8019f606849Smrg return(XvBadReply); 8029f606849Smrg } 8039f606849Smrg 8049f606849Smrg *p_actual_width = rep.actual_width; 8059f606849Smrg *p_actual_height = rep.actual_height; 8069f606849Smrg 8079f606849Smrg UnlockDisplay(dpy); 8089f606849Smrg SyncHandle(); 8099f606849Smrg 8109f606849Smrg return (Success); 8119f606849Smrg} 8129f606849Smrg 8139f606849Smrg 8149f606849SmrgXvAttribute* 8159f606849SmrgXvQueryPortAttributes(Display *dpy, XvPortID port, int *num) 8169f606849Smrg{ 8179f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 8189f606849Smrg xvQueryPortAttributesReq *req; 8199f606849Smrg xvQueryPortAttributesReply rep; 8209f606849Smrg XvAttribute *ret = NULL; 8219f606849Smrg 8229f606849Smrg *num = 0; 8239f606849Smrg 8249f606849Smrg XvCheckExtension(dpy, info, NULL); 8259f606849Smrg 8269f606849Smrg LockDisplay(dpy); 8279f606849Smrg 8289f606849Smrg XvGetReq(QueryPortAttributes, req); 8299f606849Smrg req->port = port; 8309f606849Smrg 8319f606849Smrg /* READ THE REPLY */ 8329f606849Smrg 8339f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 8349f606849Smrg UnlockDisplay(dpy); 8359f606849Smrg SyncHandle(); 8369f606849Smrg return ret; 8379f606849Smrg } 8389f606849Smrg 8399f606849Smrg if(rep.num_attributes) { 8409f606849Smrg int size = (rep.num_attributes * sizeof(XvAttribute)) + rep.text_size; 8419f606849Smrg 8429f606849Smrg if((ret = Xmalloc(size))) { 8439f606849Smrg char* marker = (char*)(&ret[rep.num_attributes]); 8449f606849Smrg xvAttributeInfo Info; 8459f606849Smrg int i; 8469f606849Smrg 8479f606849Smrg for(i = 0; i < rep.num_attributes; i++) { 8489f606849Smrg _XRead(dpy, (char*)(&Info), sz_xvAttributeInfo); 8499f606849Smrg ret[i].flags = (int)Info.flags; 8509f606849Smrg ret[i].min_value = Info.min; 8519f606849Smrg ret[i].max_value = Info.max; 8529f606849Smrg ret[i].name = marker; 8539f606849Smrg _XRead(dpy, marker, Info.size); 8549f606849Smrg marker += Info.size; 8559f606849Smrg (*num)++; 8569f606849Smrg } 8579f606849Smrg } else 8589f606849Smrg _XEatData(dpy, rep.length << 2); 8599f606849Smrg } 8609f606849Smrg 8619f606849Smrg UnlockDisplay(dpy); 8629f606849Smrg SyncHandle(); 8639f606849Smrg 8649f606849Smrg return ret; 8659f606849Smrg} 8669f606849Smrg 8679f606849SmrgXvImageFormatValues * XvListImageFormats ( 8689f606849Smrg Display *dpy, 8699f606849Smrg XvPortID port, 8709f606849Smrg int *num 8719f606849Smrg){ 8729f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 8739f606849Smrg xvListImageFormatsReq *req; 8749f606849Smrg xvListImageFormatsReply rep; 8759f606849Smrg XvImageFormatValues *ret = NULL; 8769f606849Smrg 8779f606849Smrg *num = 0; 8789f606849Smrg 8799f606849Smrg XvCheckExtension(dpy, info, NULL); 8809f606849Smrg 8819f606849Smrg LockDisplay(dpy); 8829f606849Smrg 8839f606849Smrg XvGetReq(ListImageFormats, req); 8849f606849Smrg req->port = port; 8859f606849Smrg 8869f606849Smrg /* READ THE REPLY */ 8879f606849Smrg 8889f606849Smrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) { 8899f606849Smrg UnlockDisplay(dpy); 8909f606849Smrg SyncHandle(); 8919f606849Smrg return NULL; 8929f606849Smrg } 8939f606849Smrg 8949f606849Smrg if(rep.num_formats) { 8959f606849Smrg int size = (rep.num_formats * sizeof(XvImageFormatValues)); 8969f606849Smrg 8979f606849Smrg if((ret = Xmalloc(size))) { 8989f606849Smrg xvImageFormatInfo Info; 8999f606849Smrg int i; 9009f606849Smrg 9019f606849Smrg for(i = 0; i < rep.num_formats; i++) { 9029f606849Smrg _XRead(dpy, (char*)(&Info), sz_xvImageFormatInfo); 9039f606849Smrg ret[i].id = Info.id; 9049f606849Smrg ret[i].type = Info.type; 9059f606849Smrg ret[i].byte_order = Info.byte_order; 9069f606849Smrg memcpy(&(ret[i].guid[0]), &(Info.guid[0]), 16); 9079f606849Smrg ret[i].bits_per_pixel = Info.bpp; 9089f606849Smrg ret[i].format = Info.format; 9099f606849Smrg ret[i].num_planes = Info.num_planes; 9109f606849Smrg ret[i].depth = Info.depth; 9119f606849Smrg ret[i].red_mask = Info.red_mask; 9129f606849Smrg ret[i].green_mask = Info.green_mask; 9139f606849Smrg ret[i].blue_mask = Info.blue_mask; 9149f606849Smrg ret[i].y_sample_bits = Info.y_sample_bits; 9159f606849Smrg ret[i].u_sample_bits = Info.u_sample_bits; 9169f606849Smrg ret[i].v_sample_bits = Info.v_sample_bits; 9179f606849Smrg ret[i].horz_y_period = Info.horz_y_period; 9189f606849Smrg ret[i].horz_u_period = Info.horz_u_period; 9199f606849Smrg ret[i].horz_v_period = Info.horz_v_period; 9209f606849Smrg ret[i].vert_y_period = Info.vert_y_period; 9219f606849Smrg ret[i].vert_u_period = Info.vert_u_period; 9229f606849Smrg ret[i].vert_v_period = Info.vert_v_period; 9239f606849Smrg memcpy(&(ret[i].component_order[0]), &(Info.comp_order[0]), 32); 9249f606849Smrg ret[i].scanline_order = Info.scanline_order; 9259f606849Smrg (*num)++; 9269f606849Smrg } 9279f606849Smrg } else 9289f606849Smrg _XEatData(dpy, rep.length << 2); 9299f606849Smrg } 9309f606849Smrg 9319f606849Smrg UnlockDisplay(dpy); 9329f606849Smrg SyncHandle(); 9339f606849Smrg 9349f606849Smrg return ret; 9359f606849Smrg} 9369f606849Smrg 9379f606849SmrgXvImage * XvCreateImage ( 9389f606849Smrg Display *dpy, 9399f606849Smrg XvPortID port, 9409f606849Smrg int id, 9419f606849Smrg char *data, 9429f606849Smrg int width, 9439f606849Smrg int height 9449f606849Smrg) { 9459f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 9469f606849Smrg xvQueryImageAttributesReq *req; 9479f606849Smrg xvQueryImageAttributesReply rep; 9489f606849Smrg XvImage *ret = NULL; 9499f606849Smrg 9509f606849Smrg XvCheckExtension(dpy, info, NULL); 9519f606849Smrg 9529f606849Smrg LockDisplay(dpy); 9539f606849Smrg 9549f606849Smrg XvGetReq(QueryImageAttributes, req); 9559f606849Smrg req->id = id; 9569f606849Smrg req->port = port; 9579f606849Smrg req->width = width; 9589f606849Smrg req->height = height; 9599f606849Smrg 9609f606849Smrg /* READ THE REPLY */ 9619f606849Smrg 9629f606849Smrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 9639f606849Smrg UnlockDisplay(dpy); 9649f606849Smrg SyncHandle(); 9659f606849Smrg return NULL; 9669f606849Smrg } 9679f606849Smrg 9689f606849Smrg if((ret = (XvImage*)Xmalloc(sizeof(XvImage) + (rep.num_planes << 3)))) { 9699f606849Smrg ret->id = id; 9709f606849Smrg ret->width = rep.width; 9719f606849Smrg ret->height = rep.height; 9729f606849Smrg ret->data_size = rep.data_size; 9739f606849Smrg ret->num_planes = rep.num_planes; 9749f606849Smrg ret->pitches = (int*)(&ret[1]); 9759f606849Smrg ret->offsets = ret->pitches + rep.num_planes; 9769f606849Smrg ret->data = data; 9779f606849Smrg ret->obdata = NULL; 9789f606849Smrg _XRead(dpy, (char*)(ret->pitches), rep.num_planes << 2); 9799f606849Smrg _XRead(dpy, (char*)(ret->offsets), rep.num_planes << 2); 9809f606849Smrg } else 9819f606849Smrg _XEatData(dpy, rep.length << 2); 9829f606849Smrg 9839f606849Smrg UnlockDisplay(dpy); 9849f606849Smrg SyncHandle(); 9859f606849Smrg 9869f606849Smrg return ret; 9879f606849Smrg} 9889f606849Smrg 9899f606849SmrgXvImage * XvShmCreateImage ( 9909f606849Smrg Display *dpy, 9919f606849Smrg XvPortID port, 9929f606849Smrg int id, 9939f606849Smrg char *data, 9949f606849Smrg int width, 9959f606849Smrg int height, 9969f606849Smrg XShmSegmentInfo *shminfo 9979f606849Smrg){ 9989f606849Smrg XvImage *ret; 9999f606849Smrg 10009f606849Smrg ret = XvCreateImage(dpy, port, id, data, width, height); 10019f606849Smrg 10029f606849Smrg if(ret) ret->obdata = (XPointer)shminfo; 10039f606849Smrg 10049f606849Smrg return ret; 10059f606849Smrg} 10069f606849Smrg 10079f606849Smrgint XvPutImage ( 10089f606849Smrg Display *dpy, 10099f606849Smrg XvPortID port, 10109f606849Smrg Drawable d, 10119f606849Smrg GC gc, 10129f606849Smrg XvImage *image, 10139f606849Smrg int src_x, 10149f606849Smrg int src_y, 10159f606849Smrg unsigned int src_w, 10169f606849Smrg unsigned int src_h, 10179f606849Smrg int dest_x, 10189f606849Smrg int dest_y, 10199f606849Smrg unsigned int dest_w, 10209f606849Smrg unsigned int dest_h 10219f606849Smrg){ 10229f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 10239f606849Smrg xvPutImageReq *req; 10249f606849Smrg int len; 10259f606849Smrg 10269f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 10279f606849Smrg 10289f606849Smrg LockDisplay(dpy); 10299f606849Smrg 10309f606849Smrg FlushGC(dpy, gc); 10319f606849Smrg 10329f606849Smrg XvGetReq(PutImage, req); 10339f606849Smrg 10349f606849Smrg req->port = port; 10359f606849Smrg req->drawable = d; 10369f606849Smrg req->gc = gc->gid; 10379f606849Smrg req->id = image->id; 10389f606849Smrg req->src_x = src_x; 10399f606849Smrg req->src_y = src_y; 10409f606849Smrg req->src_w = src_w; 10419f606849Smrg req->src_h = src_h; 10429f606849Smrg req->drw_x = dest_x; 10439f606849Smrg req->drw_y = dest_y; 10449f606849Smrg req->drw_w = dest_w; 10459f606849Smrg req->drw_h = dest_h; 10469f606849Smrg req->width = image->width; 10479f606849Smrg req->height = image->height; 10489f606849Smrg 10499f606849Smrg len = (image->data_size + 3) >> 2; 10509f606849Smrg SetReqLen(req, len, len); 10519f606849Smrg 10529f606849Smrg /* Yes it's kindof lame that we are sending the whole thing, 10539f606849Smrg but for video all of it may be needed even if displaying 10549f606849Smrg only a subsection, and I don't want to go through the 10559f606849Smrg trouble of creating subregions to send */ 10569f606849Smrg Data(dpy, (char *)image->data, image->data_size); 10579f606849Smrg 10589f606849Smrg UnlockDisplay(dpy); 10599f606849Smrg SyncHandle(); 10609f606849Smrg 10619f606849Smrg return Success; 10629f606849Smrg} 10639f606849Smrg 10649f606849Smrgint XvShmPutImage ( 10659f606849Smrg Display *dpy, 10669f606849Smrg XvPortID port, 10679f606849Smrg Drawable d, 10689f606849Smrg GC gc, 10699f606849Smrg XvImage *image, 10709f606849Smrg int src_x, 10719f606849Smrg int src_y, 10729f606849Smrg unsigned int src_w, 10739f606849Smrg unsigned int src_h, 10749f606849Smrg int dest_x, 10759f606849Smrg int dest_y, 10769f606849Smrg unsigned int dest_w, 10779f606849Smrg unsigned int dest_h, 10789f606849Smrg Bool send_event 10799f606849Smrg){ 10809f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 10819f606849Smrg XShmSegmentInfo *shminfo = (XShmSegmentInfo *)image->obdata; 10829f606849Smrg xvShmPutImageReq *req; 10839f606849Smrg 10849f606849Smrg XvCheckExtension(dpy, info, XvBadExtension); 10859f606849Smrg 10869f606849Smrg LockDisplay(dpy); 10879f606849Smrg 10889f606849Smrg FlushGC(dpy, gc); 10899f606849Smrg 10909f606849Smrg XvGetReq(ShmPutImage, req); 10919f606849Smrg 10929f606849Smrg req->port = port; 10939f606849Smrg req->drawable = d; 10949f606849Smrg req->gc = gc->gid; 10959f606849Smrg req->shmseg = shminfo->shmseg; 10969f606849Smrg req->id = image->id; 10979f606849Smrg req->src_x = src_x; 10989f606849Smrg req->src_y = src_y; 10999f606849Smrg req->src_w = src_w; 11009f606849Smrg req->src_h = src_h; 11019f606849Smrg req->drw_x = dest_x; 11029f606849Smrg req->drw_y = dest_y; 11039f606849Smrg req->drw_w = dest_w; 11049f606849Smrg req->drw_h = dest_h; 11059f606849Smrg req->offset = image->data - shminfo->shmaddr; 11069f606849Smrg req->width = image->width; 11079f606849Smrg req->height = image->height; 11089f606849Smrg req->send_event = send_event; 11099f606849Smrg 11109f606849Smrg UnlockDisplay(dpy); 11119f606849Smrg SyncHandle(); 11129f606849Smrg 11139f606849Smrg return Success; 11149f606849Smrg} 11159f606849Smrg 11169f606849Smrg 11179f606849Smrgstatic Bool 11189f606849Smrgxv_wire_to_event(Display *dpy, XEvent *host, xEvent *wire) 11199f606849Smrg{ 11209f606849Smrg XExtDisplayInfo *info = xv_find_display(dpy); 11219f606849Smrg XvEvent *re = (XvEvent *)host; 11229f606849Smrg xvEvent *event = (xvEvent *)wire; 11239f606849Smrg 11249f606849Smrg XvCheckExtension(dpy, info, False); 11259f606849Smrg 11269f606849Smrg switch((event->u.u.type & 0x7F) - info->codes->first_event) 11279f606849Smrg { 11289f606849Smrg case XvVideoNotify: 11299f606849Smrg re->xvvideo.type = event->u.u.type & 0x7f; 11309f606849Smrg re->xvvideo.serial = 11319f606849Smrg _XSetLastRequestRead(dpy, (xGenericReply *)event); 11329f606849Smrg re->xvvideo.send_event = ((event->u.u.type & 0x80) != 0); 11339f606849Smrg re->xvvideo.display = dpy; 11349f606849Smrg re->xvvideo.time = event->u.videoNotify.time; 11359f606849Smrg re->xvvideo.reason = event->u.videoNotify.reason; 11369f606849Smrg re->xvvideo.drawable = event->u.videoNotify.drawable; 11379f606849Smrg re->xvvideo.port_id = event->u.videoNotify.port; 11389f606849Smrg break; 11399f606849Smrg case XvPortNotify: 11409f606849Smrg re->xvport.type = event->u.u.type & 0x7f; 11419f606849Smrg re->xvport.serial = 11429f606849Smrg _XSetLastRequestRead(dpy, (xGenericReply *)event); 11439f606849Smrg re->xvport.send_event = ((event->u.u.type & 0x80) != 0); 11449f606849Smrg re->xvport.display = dpy; 11459f606849Smrg re->xvport.time = event->u.portNotify.time; 11469f606849Smrg re->xvport.port_id = event->u.portNotify.port; 11479f606849Smrg re->xvport.attribute = event->u.portNotify.attribute; 11489f606849Smrg re->xvport.value = event->u.portNotify.value; 11499f606849Smrg break; 11509f606849Smrg default: 11519f606849Smrg return False; 11529f606849Smrg } 11539f606849Smrg 11549f606849Smrg return (True); 11559f606849Smrg} 11569f606849Smrg 11579f606849Smrg 1158