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