xvdisp.c revision 48a68b89
1706f2543Smrg/***********************************************************
2706f2543SmrgCopyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
3706f2543Smrgand the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4706f2543Smrg
5706f2543Smrg                        All Rights Reserved
6706f2543Smrg
7706f2543SmrgPermission to use, copy, modify, and distribute this software and its
8706f2543Smrgdocumentation for any purpose and without fee is hereby granted,
9706f2543Smrgprovided that the above copyright notice appear in all copies and that
10706f2543Smrgboth that copyright notice and this permission notice appear in
11706f2543Smrgsupporting documentation, and that the names of Digital or MIT not be
12706f2543Smrgused in advertising or publicity pertaining to distribution of the
13706f2543Smrgsoftware without specific, written prior permission.
14706f2543Smrg
15706f2543SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16706f2543SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17706f2543SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18706f2543SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19706f2543SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20706f2543SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21706f2543SmrgSOFTWARE.
22706f2543Smrg******************************************************************/
23706f2543Smrg
24706f2543Smrg#ifdef HAVE_DIX_CONFIG_H
25706f2543Smrg#include <dix-config.h>
26706f2543Smrg#endif
27706f2543Smrg
28706f2543Smrg#include <string.h>
29706f2543Smrg
30706f2543Smrg#include <X11/X.h>
31706f2543Smrg#include <X11/Xproto.h>
32706f2543Smrg#include "misc.h"
33706f2543Smrg#include "scrnintstr.h"
34706f2543Smrg#include "windowstr.h"
35706f2543Smrg#include "pixmapstr.h"
36706f2543Smrg#include "gcstruct.h"
37706f2543Smrg#include "dixstruct.h"
38706f2543Smrg#include "resource.h"
39706f2543Smrg#include "opaque.h"
40706f2543Smrg
41706f2543Smrg#include <X11/extensions/Xv.h>
42706f2543Smrg#include <X11/extensions/Xvproto.h>
43706f2543Smrg#include "xvdix.h"
44706f2543Smrg#ifdef MITSHM
45706f2543Smrg#include <X11/extensions/shmproto.h>
46706f2543Smrg#endif
47706f2543Smrg
48706f2543Smrg#include "xvdisp.h"
49706f2543Smrg
50706f2543Smrg#ifdef PANORAMIX
51706f2543Smrg#include "panoramiX.h"
52706f2543Smrg#include "panoramiXsrv.h"
53706f2543Smrg
54706f2543Smrgunsigned long XvXRTPort;
55706f2543Smrg#endif
56706f2543Smrg
57706f2543Smrgstatic int
58706f2543SmrgSWriteQueryExtensionReply(
59706f2543Smrg   ClientPtr client,
60706f2543Smrg   xvQueryExtensionReply *rep
61706f2543Smrg){
62706f2543Smrg  char n;
63706f2543Smrg
64706f2543Smrg  swaps(&rep->sequenceNumber, n);
65706f2543Smrg  swapl(&rep->length, n);
66706f2543Smrg  swaps(&rep->version, n);
67706f2543Smrg  swaps(&rep->revision, n);
68706f2543Smrg
69706f2543Smrg  (void)WriteToClient(client, sz_xvQueryExtensionReply, (char *)rep);
70706f2543Smrg
71706f2543Smrg  return Success;
72706f2543Smrg}
73706f2543Smrg
74706f2543Smrgstatic int
75706f2543SmrgSWriteQueryAdaptorsReply(
76706f2543Smrg   ClientPtr client,
77706f2543Smrg   xvQueryAdaptorsReply *rep
78706f2543Smrg){
79706f2543Smrg  char n;
80706f2543Smrg
81706f2543Smrg  swaps(&rep->sequenceNumber, n);
82706f2543Smrg  swapl(&rep->length, n);
83706f2543Smrg  swaps(&rep->num_adaptors, n);
84706f2543Smrg
85706f2543Smrg  (void)WriteToClient(client, sz_xvQueryAdaptorsReply, (char *)rep);
86706f2543Smrg
87706f2543Smrg  return Success;
88706f2543Smrg}
89706f2543Smrg
90706f2543Smrgstatic int
91706f2543SmrgSWriteQueryEncodingsReply(
92706f2543Smrg   ClientPtr client,
93706f2543Smrg   xvQueryEncodingsReply *rep
94706f2543Smrg){
95706f2543Smrg  char n;
96706f2543Smrg
97706f2543Smrg  swaps(&rep->sequenceNumber, n);
98706f2543Smrg  swapl(&rep->length, n);
99706f2543Smrg  swaps(&rep->num_encodings, n);
100706f2543Smrg
101706f2543Smrg  (void)WriteToClient(client, sz_xvQueryEncodingsReply, (char *)rep);
102706f2543Smrg
103706f2543Smrg  return Success;
104706f2543Smrg}
105706f2543Smrg
106706f2543Smrgstatic int
107706f2543SmrgSWriteAdaptorInfo(
108706f2543Smrg   ClientPtr client,
109706f2543Smrg   xvAdaptorInfo *pAdaptor
110706f2543Smrg){
111706f2543Smrg  char n;
112706f2543Smrg
113706f2543Smrg  swapl(&pAdaptor->base_id, n);
114706f2543Smrg  swaps(&pAdaptor->name_size, n);
115706f2543Smrg  swaps(&pAdaptor->num_ports, n);
116706f2543Smrg  swaps(&pAdaptor->num_formats, n);
117706f2543Smrg
118706f2543Smrg  (void)WriteToClient(client, sz_xvAdaptorInfo, (char *)pAdaptor);
119706f2543Smrg
120706f2543Smrg  return Success;
121706f2543Smrg}
122706f2543Smrg
123706f2543Smrgstatic int
124706f2543SmrgSWriteEncodingInfo(
125706f2543Smrg   ClientPtr client,
126706f2543Smrg   xvEncodingInfo *pEncoding
127706f2543Smrg){
128706f2543Smrg  char n;
129706f2543Smrg
130706f2543Smrg  swapl(&pEncoding->encoding, n);
131706f2543Smrg  swaps(&pEncoding->name_size, n);
132706f2543Smrg  swaps(&pEncoding->width, n);
133706f2543Smrg  swaps(&pEncoding->height, n);
134706f2543Smrg  swapl(&pEncoding->rate.numerator, n);
135706f2543Smrg  swapl(&pEncoding->rate.denominator, n);
136706f2543Smrg  (void)WriteToClient(client, sz_xvEncodingInfo, (char *)pEncoding);
137706f2543Smrg
138706f2543Smrg  return Success;
139706f2543Smrg}
140706f2543Smrg
141706f2543Smrgstatic int
142706f2543SmrgSWriteFormat(
143706f2543Smrg   ClientPtr client,
144706f2543Smrg   xvFormat *pFormat
145706f2543Smrg){
146706f2543Smrg  char n;
147706f2543Smrg
148706f2543Smrg  swapl(&pFormat->visual, n);
149706f2543Smrg  (void)WriteToClient(client, sz_xvFormat, (char *)pFormat);
150706f2543Smrg
151706f2543Smrg  return Success;
152706f2543Smrg}
153706f2543Smrg
154706f2543Smrgstatic int
155706f2543SmrgSWriteAttributeInfo(
156706f2543Smrg   ClientPtr client,
157706f2543Smrg   xvAttributeInfo *pAtt
158706f2543Smrg){
159706f2543Smrg  char n;
160706f2543Smrg
161706f2543Smrg  swapl(&pAtt->flags, n);
162706f2543Smrg  swapl(&pAtt->size, n);
163706f2543Smrg  swapl(&pAtt->min, n);
164706f2543Smrg  swapl(&pAtt->max, n);
165706f2543Smrg  (void)WriteToClient(client, sz_xvAttributeInfo, (char *)pAtt);
166706f2543Smrg
167706f2543Smrg  return Success;
168706f2543Smrg}
169706f2543Smrg
170706f2543Smrgstatic int
171706f2543SmrgSWriteImageFormatInfo(
172706f2543Smrg   ClientPtr client,
173706f2543Smrg   xvImageFormatInfo *pImage
174706f2543Smrg){
175706f2543Smrg  char n;
176706f2543Smrg
177706f2543Smrg  swapl(&pImage->id, n);
178706f2543Smrg  swapl(&pImage->red_mask, n);
179706f2543Smrg  swapl(&pImage->green_mask, n);
180706f2543Smrg  swapl(&pImage->blue_mask, n);
181706f2543Smrg  swapl(&pImage->y_sample_bits, n);
182706f2543Smrg  swapl(&pImage->u_sample_bits, n);
183706f2543Smrg  swapl(&pImage->v_sample_bits, n);
184706f2543Smrg  swapl(&pImage->horz_y_period, n);
185706f2543Smrg  swapl(&pImage->horz_u_period, n);
186706f2543Smrg  swapl(&pImage->horz_v_period, n);
187706f2543Smrg  swapl(&pImage->vert_y_period, n);
188706f2543Smrg  swapl(&pImage->vert_u_period, n);
189706f2543Smrg  swapl(&pImage->vert_v_period, n);
190706f2543Smrg
191706f2543Smrg  (void)WriteToClient(client, sz_xvImageFormatInfo, (char *)pImage);
192706f2543Smrg
193706f2543Smrg  return Success;
194706f2543Smrg}
195706f2543Smrg
196706f2543Smrgstatic int
197706f2543SmrgSWriteGrabPortReply(
198706f2543Smrg   ClientPtr client,
199706f2543Smrg   xvGrabPortReply *rep
200706f2543Smrg){
201706f2543Smrg  char n;
202706f2543Smrg
203706f2543Smrg  swaps(&rep->sequenceNumber, n);
204706f2543Smrg  swapl(&rep->length, n);
205706f2543Smrg
206706f2543Smrg  (void)WriteToClient(client, sz_xvGrabPortReply, (char *)rep);
207706f2543Smrg
208706f2543Smrg  return Success;
209706f2543Smrg}
210706f2543Smrg
211706f2543Smrgstatic int
212706f2543SmrgSWriteGetPortAttributeReply(
213706f2543Smrg   ClientPtr client,
214706f2543Smrg   xvGetPortAttributeReply *rep
215706f2543Smrg){
216706f2543Smrg  char n;
217706f2543Smrg
218706f2543Smrg  swaps(&rep->sequenceNumber, n);
219706f2543Smrg  swapl(&rep->length, n);
220706f2543Smrg  swapl(&rep->value, n);
221706f2543Smrg
222706f2543Smrg  (void)WriteToClient(client, sz_xvGetPortAttributeReply, (char *)rep);
223706f2543Smrg
224706f2543Smrg  return Success;
225706f2543Smrg}
226706f2543Smrg
227706f2543Smrgstatic int
228706f2543SmrgSWriteQueryBestSizeReply(
229706f2543Smrg   ClientPtr client,
230706f2543Smrg   xvQueryBestSizeReply *rep
231706f2543Smrg){
232706f2543Smrg  char n;
233706f2543Smrg
234706f2543Smrg  swaps(&rep->sequenceNumber, n);
235706f2543Smrg  swapl(&rep->length, n);
236706f2543Smrg  swaps(&rep->actual_width, n);
237706f2543Smrg  swaps(&rep->actual_height, n);
238706f2543Smrg
239706f2543Smrg  (void)WriteToClient(client, sz_xvQueryBestSizeReply, (char *)rep);
240706f2543Smrg
241706f2543Smrg  return Success;
242706f2543Smrg}
243706f2543Smrg
244706f2543Smrgstatic int
245706f2543SmrgSWriteQueryPortAttributesReply(
246706f2543Smrg   ClientPtr client,
247706f2543Smrg   xvQueryPortAttributesReply *rep
248706f2543Smrg){
249706f2543Smrg  char n;
250706f2543Smrg
251706f2543Smrg  swaps(&rep->sequenceNumber, n);
252706f2543Smrg  swapl(&rep->length, n);
253706f2543Smrg  swapl(&rep->num_attributes, n);
254706f2543Smrg  swapl(&rep->text_size, n);
255706f2543Smrg
256706f2543Smrg  (void)WriteToClient(client, sz_xvQueryPortAttributesReply, (char *)rep);
257706f2543Smrg
258706f2543Smrg  return Success;
259706f2543Smrg}
260706f2543Smrg
261706f2543Smrgstatic int
262706f2543SmrgSWriteQueryImageAttributesReply(
263706f2543Smrg   ClientPtr client,
264706f2543Smrg   xvQueryImageAttributesReply *rep
265706f2543Smrg){
266706f2543Smrg  char n;
267706f2543Smrg
268706f2543Smrg  swaps(&rep->sequenceNumber, n);
269706f2543Smrg  swapl(&rep->length, n);
270706f2543Smrg  swapl(&rep->num_planes, n);
271706f2543Smrg  swapl(&rep->data_size, n);
272706f2543Smrg  swaps(&rep->width, n);
273706f2543Smrg  swaps(&rep->height, n);
274706f2543Smrg
275706f2543Smrg  (void)WriteToClient(client, sz_xvQueryImageAttributesReply, (char *)rep);
276706f2543Smrg
277706f2543Smrg  return Success;
278706f2543Smrg}
279706f2543Smrg
280706f2543Smrgstatic int
281706f2543SmrgSWriteListImageFormatsReply(
282706f2543Smrg   ClientPtr client,
283706f2543Smrg   xvListImageFormatsReply *rep
284706f2543Smrg){
285706f2543Smrg  char n;
286706f2543Smrg
287706f2543Smrg  swaps(&rep->sequenceNumber, n);
288706f2543Smrg  swapl(&rep->length, n);
289706f2543Smrg  swapl(&rep->num_formats, n);
290706f2543Smrg
291706f2543Smrg  (void)WriteToClient(client, sz_xvListImageFormatsReply, (char *)rep);
292706f2543Smrg
293706f2543Smrg  return Success;
294706f2543Smrg}
295706f2543Smrg
296706f2543Smrg#define _WriteQueryAdaptorsReply(_c,_d) \
297706f2543Smrg  if ((_c)->swapped) SWriteQueryAdaptorsReply(_c, _d); \
298706f2543Smrg  else WriteToClient(_c, sz_xvQueryAdaptorsReply, (char*)_d)
299706f2543Smrg
300706f2543Smrg#define _WriteQueryExtensionReply(_c,_d) \
301706f2543Smrg  if ((_c)->swapped) SWriteQueryExtensionReply(_c, _d); \
302706f2543Smrg  else WriteToClient(_c, sz_xvQueryExtensionReply, (char*)_d)
303706f2543Smrg
304706f2543Smrg#define _WriteQueryEncodingsReply(_c,_d) \
305706f2543Smrg  if ((_c)->swapped) SWriteQueryEncodingsReply(_c, _d); \
306706f2543Smrg  else WriteToClient(_c, sz_xvQueryEncodingsReply, (char*)_d)
307706f2543Smrg
308706f2543Smrg#define _WriteAdaptorInfo(_c,_d) \
309706f2543Smrg  if ((_c)->swapped) SWriteAdaptorInfo(_c, _d); \
310706f2543Smrg  else WriteToClient(_c, sz_xvAdaptorInfo, (char*)_d)
311706f2543Smrg
312706f2543Smrg#define _WriteAttributeInfo(_c,_d) \
313706f2543Smrg  if ((_c)->swapped) SWriteAttributeInfo(_c, _d); \
314706f2543Smrg  else WriteToClient(_c, sz_xvAttributeInfo, (char*)_d)
315706f2543Smrg
316706f2543Smrg#define _WriteEncodingInfo(_c,_d) \
317706f2543Smrg  if ((_c)->swapped) SWriteEncodingInfo(_c, _d); \
318706f2543Smrg  else WriteToClient(_c, sz_xvEncodingInfo, (char*)_d)
319706f2543Smrg
320706f2543Smrg#define _WriteFormat(_c,_d) \
321706f2543Smrg  if ((_c)->swapped) SWriteFormat(_c, _d); \
322706f2543Smrg  else WriteToClient(_c, sz_xvFormat, (char*)_d)
323706f2543Smrg
324706f2543Smrg#define _WriteGrabPortReply(_c,_d) \
325706f2543Smrg  if ((_c)->swapped) SWriteGrabPortReply(_c, _d); \
326706f2543Smrg  else WriteToClient(_c, sz_xvGrabPortReply, (char*)_d)
327706f2543Smrg
328706f2543Smrg#define _WriteGetPortAttributeReply(_c,_d) \
329706f2543Smrg  if ((_c)->swapped) SWriteGetPortAttributeReply(_c, _d); \
330706f2543Smrg  else WriteToClient(_c, sz_xvGetPortAttributeReply, (char*)_d)
331706f2543Smrg
332706f2543Smrg#define _WriteQueryBestSizeReply(_c,_d) \
333706f2543Smrg  if ((_c)->swapped) SWriteQueryBestSizeReply(_c, _d); \
334706f2543Smrg  else WriteToClient(_c, sz_xvQueryBestSizeReply,(char*) _d)
335706f2543Smrg
336706f2543Smrg#define _WriteQueryPortAttributesReply(_c,_d) \
337706f2543Smrg  if ((_c)->swapped) SWriteQueryPortAttributesReply(_c, _d); \
338706f2543Smrg  else WriteToClient(_c, sz_xvQueryPortAttributesReply,(char*) _d)
339706f2543Smrg
340706f2543Smrg#define _WriteQueryImageAttributesReply(_c,_d) \
341706f2543Smrg  if ((_c)->swapped) SWriteQueryImageAttributesReply(_c, _d); \
342706f2543Smrg  else WriteToClient(_c, sz_xvQueryImageAttributesReply,(char*) _d)
343706f2543Smrg
344706f2543Smrg#define _WriteListImageFormatsReply(_c,_d) \
345706f2543Smrg  if ((_c)->swapped) SWriteListImageFormatsReply(_c, _d); \
346706f2543Smrg  else WriteToClient(_c, sz_xvListImageFormatsReply,(char*) _d)
347706f2543Smrg
348706f2543Smrg#define _WriteImageFormatInfo(_c,_d) \
349706f2543Smrg  if ((_c)->swapped) SWriteImageFormatInfo(_c, _d); \
350706f2543Smrg  else WriteToClient(_c, sz_xvImageFormatInfo, (char*)_d)
351706f2543Smrg
352706f2543Smrg#define _AllocatePort(_i,_p) \
353706f2543Smrg  ((_p)->id != _i) ? (* (_p)->pAdaptor->ddAllocatePort)(_i,_p,&_p) : Success
354706f2543Smrg
355706f2543Smrgstatic int
356706f2543SmrgProcXvQueryExtension(ClientPtr client)
357706f2543Smrg{
358706f2543Smrg  xvQueryExtensionReply rep;
359706f2543Smrg  /* REQUEST(xvQueryExtensionReq); */
360706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryExtensionReq);
361706f2543Smrg
362706f2543Smrg  rep.type = X_Reply;
363706f2543Smrg  rep.sequenceNumber = client->sequence;
364706f2543Smrg  rep.length = 0;
365706f2543Smrg  rep.version = XvVersion;
366706f2543Smrg  rep.revision = XvRevision;
367706f2543Smrg
368706f2543Smrg  _WriteQueryExtensionReply(client, &rep);
369706f2543Smrg
370706f2543Smrg  return Success;
371706f2543Smrg}
372706f2543Smrg
373706f2543Smrgstatic int
374706f2543SmrgProcXvQueryAdaptors(ClientPtr client)
375706f2543Smrg{
376706f2543Smrg  xvFormat format;
377706f2543Smrg  xvAdaptorInfo ainfo;
378706f2543Smrg  xvQueryAdaptorsReply rep;
379706f2543Smrg  int totalSize, na, nf, rc;
380706f2543Smrg  int nameSize;
381706f2543Smrg  XvAdaptorPtr pa;
382706f2543Smrg  XvFormatPtr pf;
383706f2543Smrg  WindowPtr pWin;
384706f2543Smrg  ScreenPtr pScreen;
385706f2543Smrg  XvScreenPtr pxvs;
386706f2543Smrg
387706f2543Smrg  REQUEST(xvQueryAdaptorsReq);
388706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryAdaptorsReq);
389706f2543Smrg
390706f2543Smrg  rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
391706f2543Smrg  if (rc != Success)
392706f2543Smrg      return rc;
393706f2543Smrg
394706f2543Smrg  pScreen = pWin->drawable.pScreen;
395706f2543Smrg  pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
396706f2543Smrg				       XvGetScreenKey());
397706f2543Smrg  if (!pxvs)
398706f2543Smrg    {
399706f2543Smrg      rep.type = X_Reply;
400706f2543Smrg      rep.sequenceNumber = client->sequence;
401706f2543Smrg      rep.num_adaptors = 0;
402706f2543Smrg      rep.length = 0;
403706f2543Smrg
404706f2543Smrg      _WriteQueryAdaptorsReply(client, &rep);
405706f2543Smrg
406706f2543Smrg      return Success;
407706f2543Smrg    }
408706f2543Smrg
409706f2543Smrg  (* pxvs->ddQueryAdaptors)(pScreen, &pxvs->pAdaptors, &pxvs->nAdaptors);
410706f2543Smrg
411706f2543Smrg  rep.type = X_Reply;
412706f2543Smrg  rep.sequenceNumber = client->sequence;
413706f2543Smrg  rep.num_adaptors = pxvs->nAdaptors;
414706f2543Smrg
415706f2543Smrg  /* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */
416706f2543Smrg
417706f2543Smrg  totalSize = pxvs->nAdaptors * sz_xvAdaptorInfo;
418706f2543Smrg
419706f2543Smrg  /* FOR EACH ADPATOR ADD UP THE BYTES FOR ENCODINGS AND FORMATS */
420706f2543Smrg
421706f2543Smrg  na = pxvs->nAdaptors;
422706f2543Smrg  pa = pxvs->pAdaptors;
423706f2543Smrg  while (na--)
424706f2543Smrg    {
425706f2543Smrg      totalSize += pad_to_int32(strlen(pa->name));
426706f2543Smrg      totalSize += pa->nFormats * sz_xvFormat;
427706f2543Smrg      pa++;
428706f2543Smrg    }
429706f2543Smrg
430706f2543Smrg  rep.length = bytes_to_int32(totalSize);
431706f2543Smrg
432706f2543Smrg  _WriteQueryAdaptorsReply(client, &rep);
433706f2543Smrg
434706f2543Smrg  na = pxvs->nAdaptors;
435706f2543Smrg  pa = pxvs->pAdaptors;
436706f2543Smrg  while (na--)
437706f2543Smrg    {
438706f2543Smrg
439706f2543Smrg      ainfo.base_id = pa->base_id;
440706f2543Smrg      ainfo.num_ports = pa->nPorts;
441706f2543Smrg      ainfo.type = pa->type;
442706f2543Smrg      ainfo.name_size = nameSize = strlen(pa->name);
443706f2543Smrg      ainfo.num_formats = pa->nFormats;
444706f2543Smrg
445706f2543Smrg      _WriteAdaptorInfo(client, &ainfo);
446706f2543Smrg
447706f2543Smrg      WriteToClient(client, nameSize, pa->name);
448706f2543Smrg
449706f2543Smrg      nf = pa->nFormats;
450706f2543Smrg      pf = pa->pFormats;
451706f2543Smrg      while (nf--)
452706f2543Smrg	{
453706f2543Smrg	  format.depth = pf->depth;
454706f2543Smrg	  format.visual = pf->visual;
455706f2543Smrg	  _WriteFormat(client, &format);
456706f2543Smrg	  pf++;
457706f2543Smrg	}
458706f2543Smrg
459706f2543Smrg      pa++;
460706f2543Smrg
461706f2543Smrg    }
462706f2543Smrg
463706f2543Smrg  return Success;
464706f2543Smrg}
465706f2543Smrg
466706f2543Smrgstatic int
467706f2543SmrgProcXvQueryEncodings(ClientPtr client)
468706f2543Smrg{
469706f2543Smrg  xvEncodingInfo einfo;
470706f2543Smrg  xvQueryEncodingsReply rep;
471706f2543Smrg  int totalSize;
472706f2543Smrg  int nameSize;
473706f2543Smrg  XvPortPtr pPort;
474706f2543Smrg  int ne;
475706f2543Smrg  XvEncodingPtr pe;
476706f2543Smrg  int status;
477706f2543Smrg
478706f2543Smrg  REQUEST(xvQueryEncodingsReq);
479706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
480706f2543Smrg
481706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
482706f2543Smrg
483706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
484706f2543Smrg    {
485706f2543Smrg      client->errorValue = stuff->port;
486706f2543Smrg      return status;
487706f2543Smrg    }
488706f2543Smrg
489706f2543Smrg  rep.type = X_Reply;
490706f2543Smrg  rep.sequenceNumber = client->sequence;
491706f2543Smrg  rep.num_encodings = pPort->pAdaptor->nEncodings;
492706f2543Smrg
493706f2543Smrg  /* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */
494706f2543Smrg
495706f2543Smrg  ne = pPort->pAdaptor->nEncodings;
496706f2543Smrg  pe = pPort->pAdaptor->pEncodings;
497706f2543Smrg  totalSize = ne * sz_xvEncodingInfo;
498706f2543Smrg  while (ne--)
499706f2543Smrg    {
500706f2543Smrg      totalSize += pad_to_int32(strlen(pe->name));
501706f2543Smrg      pe++;
502706f2543Smrg    }
503706f2543Smrg
504706f2543Smrg  rep.length = bytes_to_int32(totalSize);
505706f2543Smrg
506706f2543Smrg  _WriteQueryEncodingsReply(client, &rep);
507706f2543Smrg
508706f2543Smrg  ne = pPort->pAdaptor->nEncodings;
509706f2543Smrg  pe = pPort->pAdaptor->pEncodings;
510706f2543Smrg  while (ne--)
511706f2543Smrg    {
512706f2543Smrg      einfo.encoding = pe->id;
513706f2543Smrg      einfo.name_size = nameSize = strlen(pe->name);
514706f2543Smrg      einfo.width = pe->width;
515706f2543Smrg      einfo.height = pe->height;
516706f2543Smrg      einfo.rate.numerator = pe->rate.numerator;
517706f2543Smrg      einfo.rate.denominator = pe->rate.denominator;
518706f2543Smrg      _WriteEncodingInfo(client, &einfo);
519706f2543Smrg      WriteToClient(client, nameSize, pe->name);
520706f2543Smrg      pe++;
521706f2543Smrg    }
522706f2543Smrg
523706f2543Smrg  return Success;
524706f2543Smrg}
525706f2543Smrg
526706f2543Smrgstatic int
527706f2543SmrgProcXvPutVideo(ClientPtr client)
528706f2543Smrg{
529706f2543Smrg  DrawablePtr pDraw;
530706f2543Smrg  XvPortPtr pPort;
531706f2543Smrg  GCPtr pGC;
532706f2543Smrg  int status;
533706f2543Smrg
534706f2543Smrg  REQUEST(xvPutVideoReq);
535706f2543Smrg  REQUEST_SIZE_MATCH(xvPutVideoReq);
536706f2543Smrg
537706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
538706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
539706f2543Smrg
540706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
541706f2543Smrg    {
542706f2543Smrg      client->errorValue = stuff->port;
543706f2543Smrg      return status;
544706f2543Smrg    }
545706f2543Smrg
546706f2543Smrg  if (!(pPort->pAdaptor->type & XvInputMask) ||
547706f2543Smrg	!(pPort->pAdaptor->type & XvVideoMask))
548706f2543Smrg    {
549706f2543Smrg      client->errorValue = stuff->port;
550706f2543Smrg      return BadMatch;
551706f2543Smrg    }
552706f2543Smrg
553706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
554706f2543Smrg  if (status != Success)
555706f2543Smrg    {
556706f2543Smrg      return status;
557706f2543Smrg    }
558706f2543Smrg
559706f2543Smrg  return XvdiPutVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
560706f2543Smrg		      stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
561706f2543Smrg		      stuff->drw_w, stuff->drw_h);
562706f2543Smrg}
563706f2543Smrg
564706f2543Smrgstatic int
565706f2543SmrgProcXvPutStill(ClientPtr client)
566706f2543Smrg{
567706f2543Smrg  DrawablePtr pDraw;
568706f2543Smrg  XvPortPtr pPort;
569706f2543Smrg  GCPtr pGC;
570706f2543Smrg  int status;
571706f2543Smrg
572706f2543Smrg  REQUEST(xvPutStillReq);
573706f2543Smrg  REQUEST_SIZE_MATCH(xvPutStillReq);
574706f2543Smrg
575706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
576706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
577706f2543Smrg
578706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
579706f2543Smrg    {
580706f2543Smrg      client->errorValue = stuff->port;
581706f2543Smrg      return status;
582706f2543Smrg    }
583706f2543Smrg
584706f2543Smrg  if (!(pPort->pAdaptor->type & XvInputMask) ||
585706f2543Smrg	!(pPort->pAdaptor->type & XvStillMask))
586706f2543Smrg    {
587706f2543Smrg      client->errorValue = stuff->port;
588706f2543Smrg      return BadMatch;
589706f2543Smrg    }
590706f2543Smrg
591706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
592706f2543Smrg  if (status != Success)
593706f2543Smrg    {
594706f2543Smrg      return status;
595706f2543Smrg    }
596706f2543Smrg
597706f2543Smrg  return XvdiPutStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
598706f2543Smrg		      stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
599706f2543Smrg		      stuff->drw_w, stuff->drw_h);
600706f2543Smrg}
601706f2543Smrg
602706f2543Smrgstatic int
603706f2543SmrgProcXvGetVideo(ClientPtr client)
604706f2543Smrg{
605706f2543Smrg  DrawablePtr pDraw;
606706f2543Smrg  XvPortPtr pPort;
607706f2543Smrg  GCPtr pGC;
608706f2543Smrg  int status;
609706f2543Smrg
610706f2543Smrg  REQUEST(xvGetVideoReq);
611706f2543Smrg  REQUEST_SIZE_MATCH(xvGetVideoReq);
612706f2543Smrg
613706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
614706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
615706f2543Smrg
616706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
617706f2543Smrg    {
618706f2543Smrg      client->errorValue = stuff->port;
619706f2543Smrg      return status;
620706f2543Smrg    }
621706f2543Smrg
622706f2543Smrg  if (!(pPort->pAdaptor->type & XvOutputMask) ||
623706f2543Smrg	!(pPort->pAdaptor->type & XvVideoMask))
624706f2543Smrg    {
625706f2543Smrg      client->errorValue = stuff->port;
626706f2543Smrg      return BadMatch;
627706f2543Smrg    }
628706f2543Smrg
629706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
630706f2543Smrg  if (status != Success)
631706f2543Smrg    {
632706f2543Smrg      return status;
633706f2543Smrg    }
634706f2543Smrg
635706f2543Smrg  return XvdiGetVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
636706f2543Smrg		      stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
637706f2543Smrg		      stuff->drw_w, stuff->drw_h);
638706f2543Smrg}
639706f2543Smrg
640706f2543Smrgstatic int
641706f2543SmrgProcXvGetStill(ClientPtr client)
642706f2543Smrg{
643706f2543Smrg  DrawablePtr pDraw;
644706f2543Smrg  XvPortPtr pPort;
645706f2543Smrg  GCPtr pGC;
646706f2543Smrg  int status;
647706f2543Smrg
648706f2543Smrg  REQUEST(xvGetStillReq);
649706f2543Smrg  REQUEST_SIZE_MATCH(xvGetStillReq);
650706f2543Smrg
651706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
652706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
653706f2543Smrg
654706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
655706f2543Smrg    {
656706f2543Smrg      client->errorValue = stuff->port;
657706f2543Smrg      return status;
658706f2543Smrg    }
659706f2543Smrg
660706f2543Smrg  if (!(pPort->pAdaptor->type & XvOutputMask) ||
661706f2543Smrg	!(pPort->pAdaptor->type & XvStillMask))
662706f2543Smrg    {
663706f2543Smrg      client->errorValue = stuff->port;
664706f2543Smrg      return BadMatch;
665706f2543Smrg    }
666706f2543Smrg
667706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
668706f2543Smrg  if (status != Success)
669706f2543Smrg    {
670706f2543Smrg      return status;
671706f2543Smrg    }
672706f2543Smrg
673706f2543Smrg  return XvdiGetStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
674706f2543Smrg		      stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
675706f2543Smrg		      stuff->drw_w, stuff->drw_h);
676706f2543Smrg}
677706f2543Smrg
678706f2543Smrgstatic int
679706f2543SmrgProcXvSelectVideoNotify(ClientPtr client)
680706f2543Smrg{
681706f2543Smrg  DrawablePtr pDraw;
682706f2543Smrg  int rc;
683706f2543Smrg  REQUEST(xvSelectVideoNotifyReq);
684706f2543Smrg  REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq);
685706f2543Smrg
686706f2543Smrg  rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReceiveAccess);
687706f2543Smrg  if (rc != Success)
688706f2543Smrg    return rc;
689706f2543Smrg
690706f2543Smrg  return XvdiSelectVideoNotify(client, pDraw, stuff->onoff);
691706f2543Smrg}
692706f2543Smrg
693706f2543Smrgstatic int
694706f2543SmrgProcXvSelectPortNotify(ClientPtr client)
695706f2543Smrg{
696706f2543Smrg  int status;
697706f2543Smrg  XvPortPtr pPort;
698706f2543Smrg  REQUEST(xvSelectPortNotifyReq);
699706f2543Smrg  REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
700706f2543Smrg
701706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
702706f2543Smrg
703706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
704706f2543Smrg    {
705706f2543Smrg      client->errorValue = stuff->port;
706706f2543Smrg      return status;
707706f2543Smrg    }
708706f2543Smrg
709706f2543Smrg  return XvdiSelectPortNotify(client, pPort, stuff->onoff);
710706f2543Smrg}
711706f2543Smrg
712706f2543Smrgstatic int
713706f2543SmrgProcXvGrabPort(ClientPtr client)
714706f2543Smrg{
715706f2543Smrg  int result, status;
716706f2543Smrg  XvPortPtr pPort;
717706f2543Smrg  xvGrabPortReply rep;
718706f2543Smrg  REQUEST(xvGrabPortReq);
719706f2543Smrg  REQUEST_SIZE_MATCH(xvGrabPortReq);
720706f2543Smrg
721706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
722706f2543Smrg
723706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
724706f2543Smrg    {
725706f2543Smrg      client->errorValue = stuff->port;
726706f2543Smrg      return status;
727706f2543Smrg    }
728706f2543Smrg
729706f2543Smrg  status = XvdiGrabPort(client, pPort, stuff->time, &result);
730706f2543Smrg
731706f2543Smrg  if (status != Success)
732706f2543Smrg    {
733706f2543Smrg      return status;
734706f2543Smrg    }
735706f2543Smrg
736706f2543Smrg  rep.type = X_Reply;
737706f2543Smrg  rep.sequenceNumber = client->sequence;
738706f2543Smrg  rep.length = 0;
739706f2543Smrg  rep.result = result;
740706f2543Smrg
741706f2543Smrg  _WriteGrabPortReply(client, &rep);
742706f2543Smrg
743706f2543Smrg  return Success;
744706f2543Smrg}
745706f2543Smrg
746706f2543Smrgstatic int
747706f2543SmrgProcXvUngrabPort(ClientPtr client)
748706f2543Smrg{
749706f2543Smrg  int status;
750706f2543Smrg  XvPortPtr pPort;
751706f2543Smrg  REQUEST(xvGrabPortReq);
752706f2543Smrg  REQUEST_SIZE_MATCH(xvGrabPortReq);
753706f2543Smrg
754706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
755706f2543Smrg
756706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
757706f2543Smrg    {
758706f2543Smrg      client->errorValue = stuff->port;
759706f2543Smrg      return status;
760706f2543Smrg    }
761706f2543Smrg
762706f2543Smrg  return XvdiUngrabPort(client, pPort, stuff->time);
763706f2543Smrg}
764706f2543Smrg
765706f2543Smrgstatic int
766706f2543SmrgProcXvStopVideo(ClientPtr client)
767706f2543Smrg{
768706f2543Smrg  int status, rc;
769706f2543Smrg  DrawablePtr pDraw;
770706f2543Smrg  XvPortPtr pPort;
771706f2543Smrg  REQUEST(xvStopVideoReq);
772706f2543Smrg  REQUEST_SIZE_MATCH(xvStopVideoReq);
773706f2543Smrg
774706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
775706f2543Smrg
776706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
777706f2543Smrg    {
778706f2543Smrg      client->errorValue = stuff->port;
779706f2543Smrg      return status;
780706f2543Smrg    }
781706f2543Smrg
782706f2543Smrg  rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
783706f2543Smrg  if (rc != Success)
784706f2543Smrg    return rc;
785706f2543Smrg
786706f2543Smrg  return XvdiStopVideo(client, pPort, pDraw);
787706f2543Smrg}
788706f2543Smrg
789706f2543Smrgstatic int
790706f2543SmrgProcXvSetPortAttribute(ClientPtr client)
791706f2543Smrg{
792706f2543Smrg  int status;
793706f2543Smrg  XvPortPtr pPort;
794706f2543Smrg  REQUEST(xvSetPortAttributeReq);
795706f2543Smrg  REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
796706f2543Smrg
797706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixSetAttrAccess);
798706f2543Smrg
799706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
800706f2543Smrg    {
801706f2543Smrg      client->errorValue = stuff->port;
802706f2543Smrg      return status;
803706f2543Smrg    }
804706f2543Smrg
805706f2543Smrg  if (!ValidAtom(stuff->attribute))
806706f2543Smrg    {
807706f2543Smrg      client->errorValue = stuff->attribute;
808706f2543Smrg      return BadAtom;
809706f2543Smrg    }
810706f2543Smrg
811706f2543Smrg  status = XvdiSetPortAttribute(client, pPort, stuff->attribute, stuff->value);
812706f2543Smrg
813706f2543Smrg  if (status == BadMatch)
814706f2543Smrg      client->errorValue = stuff->attribute;
815706f2543Smrg  else
816706f2543Smrg      client->errorValue = stuff->value;
817706f2543Smrg
818706f2543Smrg  return status;
819706f2543Smrg}
820706f2543Smrg
821706f2543Smrgstatic int
822706f2543SmrgProcXvGetPortAttribute(ClientPtr client)
823706f2543Smrg{
824706f2543Smrg  INT32 value;
825706f2543Smrg  int status;
826706f2543Smrg  XvPortPtr pPort;
827706f2543Smrg  xvGetPortAttributeReply rep;
828706f2543Smrg  REQUEST(xvGetPortAttributeReq);
829706f2543Smrg  REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
830706f2543Smrg
831706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
832706f2543Smrg
833706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
834706f2543Smrg    {
835706f2543Smrg      client->errorValue = stuff->port;
836706f2543Smrg      return status;
837706f2543Smrg    }
838706f2543Smrg
839706f2543Smrg  if (!ValidAtom(stuff->attribute))
840706f2543Smrg    {
841706f2543Smrg      client->errorValue = stuff->attribute;
842706f2543Smrg      return BadAtom;
843706f2543Smrg    }
844706f2543Smrg
845706f2543Smrg  status = XvdiGetPortAttribute(client, pPort, stuff->attribute, &value);
846706f2543Smrg  if (status != Success)
847706f2543Smrg    {
848706f2543Smrg      client->errorValue = stuff->attribute;
849706f2543Smrg      return status;
850706f2543Smrg    }
851706f2543Smrg
852706f2543Smrg  rep.type = X_Reply;
853706f2543Smrg  rep.sequenceNumber = client->sequence;
854706f2543Smrg  rep.length = 0;
855706f2543Smrg  rep.value = value;
856706f2543Smrg
857706f2543Smrg  _WriteGetPortAttributeReply(client, &rep);
858706f2543Smrg
859706f2543Smrg  return Success;
860706f2543Smrg}
861706f2543Smrg
862706f2543Smrgstatic int
863706f2543SmrgProcXvQueryBestSize(ClientPtr client)
864706f2543Smrg{
865706f2543Smrg  int status;
866706f2543Smrg  unsigned int actual_width, actual_height;
867706f2543Smrg  XvPortPtr pPort;
868706f2543Smrg  xvQueryBestSizeReply rep;
869706f2543Smrg  REQUEST(xvQueryBestSizeReq);
870706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
871706f2543Smrg
872706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
873706f2543Smrg
874706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
875706f2543Smrg    {
876706f2543Smrg      client->errorValue = stuff->port;
877706f2543Smrg      return status;
878706f2543Smrg    }
879706f2543Smrg
880706f2543Smrg  rep.type = X_Reply;
881706f2543Smrg  rep.sequenceNumber = client->sequence;
882706f2543Smrg  rep.length = 0;
883706f2543Smrg
884706f2543Smrg  (* pPort->pAdaptor->ddQueryBestSize)(client, pPort, stuff->motion,
885706f2543Smrg				       stuff->vid_w, stuff->vid_h,
886706f2543Smrg				       stuff->drw_w, stuff->drw_h,
887706f2543Smrg				       &actual_width, &actual_height);
888706f2543Smrg
889706f2543Smrg  rep.actual_width = actual_width;
890706f2543Smrg  rep.actual_height = actual_height;
891706f2543Smrg
892706f2543Smrg  _WriteQueryBestSizeReply(client, &rep);
893706f2543Smrg
894706f2543Smrg  return Success;
895706f2543Smrg}
896706f2543Smrg
897706f2543Smrg
898706f2543Smrgstatic int
899706f2543SmrgProcXvQueryPortAttributes(ClientPtr client)
900706f2543Smrg{
901706f2543Smrg  int status, size, i;
902706f2543Smrg  XvPortPtr pPort;
903706f2543Smrg  XvAttributePtr pAtt;
904706f2543Smrg  xvQueryPortAttributesReply rep;
905706f2543Smrg  xvAttributeInfo Info;
906706f2543Smrg  REQUEST(xvQueryPortAttributesReq);
907706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
908706f2543Smrg
909706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
910706f2543Smrg
911706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
912706f2543Smrg    {
913706f2543Smrg      client->errorValue = stuff->port;
914706f2543Smrg      return status;
915706f2543Smrg    }
916706f2543Smrg
917706f2543Smrg  rep.type = X_Reply;
918706f2543Smrg  rep.sequenceNumber = client->sequence;
919706f2543Smrg  rep.num_attributes = pPort->pAdaptor->nAttributes;
920706f2543Smrg  rep.text_size = 0;
921706f2543Smrg
922706f2543Smrg  for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
923706f2543Smrg      i < pPort->pAdaptor->nAttributes; i++, pAtt++)
924706f2543Smrg  {
925706f2543Smrg      rep.text_size += pad_to_int32(strlen(pAtt->name) + 1);
926706f2543Smrg  }
927706f2543Smrg
928706f2543Smrg  rep.length = (pPort->pAdaptor->nAttributes * sz_xvAttributeInfo)
929706f2543Smrg      + rep.text_size;
930706f2543Smrg  rep.length >>= 2;
931706f2543Smrg
932706f2543Smrg  _WriteQueryPortAttributesReply(client, &rep);
933706f2543Smrg
934706f2543Smrg  for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
935706f2543Smrg      i < pPort->pAdaptor->nAttributes; i++, pAtt++)
936706f2543Smrg  {
937706f2543Smrg      size = strlen(pAtt->name) + 1;  /* pass the NULL */
938706f2543Smrg      Info.flags = pAtt->flags;
939706f2543Smrg      Info.min = pAtt->min_value;
940706f2543Smrg      Info.max = pAtt->max_value;
941706f2543Smrg      Info.size = pad_to_int32(size);
942706f2543Smrg
943706f2543Smrg      _WriteAttributeInfo(client, &Info);
944706f2543Smrg
945706f2543Smrg      WriteToClient(client, size, pAtt->name);
946706f2543Smrg  }
947706f2543Smrg
948706f2543Smrg  return Success;
949706f2543Smrg}
950706f2543Smrg
951706f2543Smrgstatic int
952706f2543SmrgProcXvPutImage(ClientPtr client)
953706f2543Smrg{
954706f2543Smrg  DrawablePtr pDraw;
955706f2543Smrg  XvPortPtr pPort;
956706f2543Smrg  XvImagePtr pImage = NULL;
957706f2543Smrg  GCPtr pGC;
958706f2543Smrg  int status, i, size;
959706f2543Smrg  CARD16 width, height;
960706f2543Smrg
961706f2543Smrg  REQUEST(xvPutImageReq);
962706f2543Smrg  REQUEST_AT_LEAST_SIZE(xvPutImageReq);
963706f2543Smrg
964706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
965706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
966706f2543Smrg
967706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
968706f2543Smrg    {
969706f2543Smrg      client->errorValue = stuff->port;
970706f2543Smrg      return status;
971706f2543Smrg    }
972706f2543Smrg
973706f2543Smrg  if (!(pPort->pAdaptor->type & XvImageMask) ||
974706f2543Smrg	!(pPort->pAdaptor->type & XvInputMask))
975706f2543Smrg    {
976706f2543Smrg      client->errorValue = stuff->port;
977706f2543Smrg      return BadMatch;
978706f2543Smrg    }
979706f2543Smrg
980706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
981706f2543Smrg  if (status != Success)
982706f2543Smrg    {
983706f2543Smrg      return status;
984706f2543Smrg    }
985706f2543Smrg
986706f2543Smrg  for(i = 0; i < pPort->pAdaptor->nImages; i++) {
987706f2543Smrg      if(pPort->pAdaptor->pImages[i].id == stuff->id) {
988706f2543Smrg	  pImage = &(pPort->pAdaptor->pImages[i]);
989706f2543Smrg	  break;
990706f2543Smrg      }
991706f2543Smrg  }
992706f2543Smrg
993706f2543Smrg  if(!pImage)
994706f2543Smrg     return BadMatch;
995706f2543Smrg
996706f2543Smrg  width = stuff->width;
997706f2543Smrg  height = stuff->height;
998706f2543Smrg  size = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
999706f2543Smrg			pPort, pImage, &width, &height, NULL, NULL);
1000706f2543Smrg  size += sizeof(xvPutImageReq);
1001706f2543Smrg  size = bytes_to_int32(size);
1002706f2543Smrg
1003706f2543Smrg  if((width < stuff->width) || (height < stuff->height))
1004706f2543Smrg     return BadValue;
1005706f2543Smrg
1006706f2543Smrg  if(client->req_len < size)
1007706f2543Smrg     return BadLength;
1008706f2543Smrg
1009706f2543Smrg  return XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
1010706f2543Smrg		      stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
1011706f2543Smrg		      stuff->drw_w, stuff->drw_h, pImage,
1012706f2543Smrg		      (unsigned char*)(&stuff[1]), FALSE,
1013706f2543Smrg		      stuff->width, stuff->height);
1014706f2543Smrg}
1015706f2543Smrg
1016706f2543Smrg#ifdef MITSHM
1017706f2543Smrg/* redefined here since it's not in any header file */
1018706f2543Smrgtypedef struct _ShmDesc {
1019706f2543Smrg    struct _ShmDesc *next;
1020706f2543Smrg    int shmid;
1021706f2543Smrg    int refcnt;
1022706f2543Smrg    char *addr;
1023706f2543Smrg    Bool writable;
1024706f2543Smrg    unsigned long size;
1025706f2543Smrg} ShmDescRec, *ShmDescPtr;
1026706f2543Smrg
1027706f2543Smrgextern RESTYPE ShmSegType;
1028706f2543Smrgextern int ShmCompletionCode;
1029706f2543Smrg
1030706f2543Smrgstatic int
1031706f2543SmrgProcXvShmPutImage(ClientPtr client)
1032706f2543Smrg{
1033706f2543Smrg  ShmDescPtr shmdesc;
1034706f2543Smrg  DrawablePtr pDraw;
1035706f2543Smrg  XvPortPtr pPort;
1036706f2543Smrg  XvImagePtr pImage = NULL;
1037706f2543Smrg  GCPtr pGC;
1038706f2543Smrg  int status, size_needed, i;
1039706f2543Smrg  CARD16 width, height;
1040706f2543Smrg
1041706f2543Smrg  REQUEST(xvShmPutImageReq);
1042706f2543Smrg  REQUEST_SIZE_MATCH(xvShmPutImageReq);
1043706f2543Smrg
1044706f2543Smrg  VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
1045706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
1046706f2543Smrg
1047706f2543Smrg  if ((status = _AllocatePort(stuff->port, pPort)) != Success)
1048706f2543Smrg    {
1049706f2543Smrg      client->errorValue = stuff->port;
1050706f2543Smrg      return status;
1051706f2543Smrg    }
1052706f2543Smrg
1053706f2543Smrg  if (!(pPort->pAdaptor->type & XvImageMask) ||
1054706f2543Smrg	!(pPort->pAdaptor->type & XvInputMask))
1055706f2543Smrg    {
1056706f2543Smrg      client->errorValue = stuff->port;
1057706f2543Smrg      return BadMatch;
1058706f2543Smrg    }
1059706f2543Smrg
1060706f2543Smrg  status = XvdiMatchPort(pPort, pDraw);
1061706f2543Smrg  if (status != Success)
1062706f2543Smrg    {
1063706f2543Smrg      return status;
1064706f2543Smrg    }
1065706f2543Smrg
1066706f2543Smrg  for(i = 0; i < pPort->pAdaptor->nImages; i++) {
1067706f2543Smrg      if(pPort->pAdaptor->pImages[i].id == stuff->id) {
1068706f2543Smrg	  pImage = &(pPort->pAdaptor->pImages[i]);
1069706f2543Smrg	  break;
1070706f2543Smrg      }
1071706f2543Smrg  }
1072706f2543Smrg
1073706f2543Smrg  if(!pImage)
1074706f2543Smrg     return BadMatch;
1075706f2543Smrg
1076706f2543Smrg  status = dixLookupResourceByType((pointer *)&shmdesc, stuff->shmseg,
1077706f2543Smrg				   ShmSegType, serverClient, DixReadAccess);
1078706f2543Smrg  if (status != Success)
1079706f2543Smrg      return status;
1080706f2543Smrg
1081706f2543Smrg  width = stuff->width;
1082706f2543Smrg  height = stuff->height;
1083706f2543Smrg  size_needed = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
1084706f2543Smrg			pPort, pImage, &width, &height, NULL, NULL);
1085706f2543Smrg  if((size_needed + stuff->offset) > shmdesc->size)
1086706f2543Smrg      return BadAccess;
1087706f2543Smrg
1088706f2543Smrg  if((width < stuff->width) || (height < stuff->height))
1089706f2543Smrg     return BadValue;
1090706f2543Smrg
1091706f2543Smrg  status = XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
1092706f2543Smrg			stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
1093706f2543Smrg			stuff->drw_w, stuff->drw_h, pImage,
1094706f2543Smrg			(unsigned char *)shmdesc->addr + stuff->offset,
1095706f2543Smrg			stuff->send_event, stuff->width, stuff->height);
1096706f2543Smrg
1097706f2543Smrg  if((status == Success) && stuff->send_event) {
1098706f2543Smrg        xShmCompletionEvent ev;
1099706f2543Smrg
1100706f2543Smrg        ev.type = ShmCompletionCode;
1101706f2543Smrg        ev.drawable = stuff->drawable;
1102706f2543Smrg        ev.minorEvent = xv_ShmPutImage;
1103706f2543Smrg        ev.majorEvent = XvReqCode;
1104706f2543Smrg        ev.shmseg = stuff->shmseg;
1105706f2543Smrg        ev.offset = stuff->offset;
1106706f2543Smrg        WriteEventsToClient(client, 1, (xEvent *) &ev);
1107706f2543Smrg  }
1108706f2543Smrg
1109706f2543Smrg  return status;
1110706f2543Smrg}
1111706f2543Smrg#else /* !MITSHM */
1112706f2543Smrgstatic int
1113706f2543SmrgProcXvShmPutImage(ClientPtr client)
1114706f2543Smrg{
1115706f2543Smrg    SendErrorToClient(client, XvReqCode, xv_ShmPutImage, 0, BadImplementation);
1116706f2543Smrg    return BadImplementation;
1117706f2543Smrg}
1118706f2543Smrg#endif
1119706f2543Smrg
1120706f2543Smrg#ifdef XvMCExtension
1121706f2543Smrg#include "xvmcext.h"
1122706f2543Smrg#endif
1123706f2543Smrg
1124706f2543Smrgstatic int
1125706f2543SmrgProcXvQueryImageAttributes(ClientPtr client)
1126706f2543Smrg{
1127706f2543Smrg  xvQueryImageAttributesReply rep;
1128706f2543Smrg  int size, num_planes, i;
1129706f2543Smrg  CARD16 width, height;
1130706f2543Smrg  XvImagePtr pImage = NULL;
1131706f2543Smrg  XvPortPtr pPort;
1132706f2543Smrg  int *offsets;
1133706f2543Smrg  int *pitches;
1134706f2543Smrg  int planeLength;
1135706f2543Smrg  REQUEST(xvQueryImageAttributesReq);
1136706f2543Smrg
1137706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryImageAttributesReq);
1138706f2543Smrg
1139706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
1140706f2543Smrg
1141706f2543Smrg  for(i = 0; i < pPort->pAdaptor->nImages; i++) {
1142706f2543Smrg      if(pPort->pAdaptor->pImages[i].id == stuff->id) {
1143706f2543Smrg	  pImage = &(pPort->pAdaptor->pImages[i]);
1144706f2543Smrg	  break;
1145706f2543Smrg      }
1146706f2543Smrg  }
1147706f2543Smrg
1148706f2543Smrg#ifdef XvMCExtension
1149706f2543Smrg  if(!pImage)
1150706f2543Smrg     pImage = XvMCFindXvImage(pPort, stuff->id);
1151706f2543Smrg#endif
1152706f2543Smrg
1153706f2543Smrg  if(!pImage)
1154706f2543Smrg     return BadMatch;
1155706f2543Smrg
1156706f2543Smrg  num_planes = pImage->num_planes;
1157706f2543Smrg
1158706f2543Smrg  if(!(offsets = malloc(num_planes << 3)))
1159706f2543Smrg	return BadAlloc;
1160706f2543Smrg  pitches = offsets + num_planes;
1161706f2543Smrg
1162706f2543Smrg  width = stuff->width;
1163706f2543Smrg  height = stuff->height;
1164706f2543Smrg
1165706f2543Smrg  size = (*pPort->pAdaptor->ddQueryImageAttributes)(client, pPort, pImage,
1166706f2543Smrg					&width, &height, offsets, pitches);
1167706f2543Smrg
1168706f2543Smrg  rep.type = X_Reply;
1169706f2543Smrg  rep.sequenceNumber = client->sequence;
1170706f2543Smrg  rep.length = planeLength = num_planes << 1;
1171706f2543Smrg  rep.num_planes = num_planes;
1172706f2543Smrg  rep.width = width;
1173706f2543Smrg  rep.height = height;
1174706f2543Smrg  rep.data_size = size;
1175706f2543Smrg
1176706f2543Smrg  _WriteQueryImageAttributesReply(client, &rep);
1177706f2543Smrg  if(client->swapped)
1178706f2543Smrg    SwapLongs((CARD32*)offsets, planeLength);
1179706f2543Smrg  WriteToClient(client, planeLength << 2, (char*)offsets);
1180706f2543Smrg
1181706f2543Smrg  free(offsets);
1182706f2543Smrg
1183706f2543Smrg  return Success;
1184706f2543Smrg}
1185706f2543Smrg
1186706f2543Smrgstatic int
1187706f2543SmrgProcXvListImageFormats(ClientPtr client)
1188706f2543Smrg{
1189706f2543Smrg  XvPortPtr pPort;
1190706f2543Smrg  XvImagePtr pImage;
1191706f2543Smrg  int i;
1192706f2543Smrg  xvListImageFormatsReply rep;
1193706f2543Smrg  xvImageFormatInfo info;
1194706f2543Smrg  REQUEST(xvListImageFormatsReq);
1195706f2543Smrg
1196706f2543Smrg  REQUEST_SIZE_MATCH(xvListImageFormatsReq);
1197706f2543Smrg
1198706f2543Smrg  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
1199706f2543Smrg
1200706f2543Smrg  rep.type = X_Reply;
1201706f2543Smrg  rep.sequenceNumber = client->sequence;
1202706f2543Smrg  rep.num_formats = pPort->pAdaptor->nImages;
1203706f2543Smrg  rep.length = bytes_to_int32(pPort->pAdaptor->nImages * sz_xvImageFormatInfo);
1204706f2543Smrg
1205706f2543Smrg  _WriteListImageFormatsReply(client, &rep);
1206706f2543Smrg
1207706f2543Smrg  pImage = pPort->pAdaptor->pImages;
1208706f2543Smrg
1209706f2543Smrg  for(i = 0; i < pPort->pAdaptor->nImages; i++, pImage++) {
1210706f2543Smrg     info.id = pImage->id;
1211706f2543Smrg     info.type = pImage->type;
1212706f2543Smrg     info.byte_order = pImage->byte_order;
1213706f2543Smrg     memcpy(&info.guid, pImage->guid, 16);
1214706f2543Smrg     info.bpp = pImage->bits_per_pixel;
1215706f2543Smrg     info.num_planes = pImage->num_planes;
1216706f2543Smrg     info.depth = pImage->depth;
1217706f2543Smrg     info.red_mask = pImage->red_mask;
1218706f2543Smrg     info.green_mask = pImage->green_mask;
1219706f2543Smrg     info.blue_mask = pImage->blue_mask;
1220706f2543Smrg     info.format = pImage->format;
1221706f2543Smrg     info.y_sample_bits = pImage->y_sample_bits;
1222706f2543Smrg     info.u_sample_bits = pImage->u_sample_bits;
1223706f2543Smrg     info.v_sample_bits = pImage->v_sample_bits;
1224706f2543Smrg     info.horz_y_period = pImage->horz_y_period;
1225706f2543Smrg     info.horz_u_period = pImage->horz_u_period;
1226706f2543Smrg     info.horz_v_period = pImage->horz_v_period;
1227706f2543Smrg     info.vert_y_period = pImage->vert_y_period;
1228706f2543Smrg     info.vert_u_period = pImage->vert_u_period;
1229706f2543Smrg     info.vert_v_period = pImage->vert_v_period;
1230706f2543Smrg     memcpy(&info.comp_order, pImage->component_order, 32);
1231706f2543Smrg     info.scanline_order = pImage->scanline_order;
1232706f2543Smrg     _WriteImageFormatInfo(client, &info);
1233706f2543Smrg  }
1234706f2543Smrg
1235706f2543Smrg  return Success;
1236706f2543Smrg}
1237706f2543Smrg
1238706f2543Smrgstatic int (*XvProcVector[xvNumRequests])(ClientPtr) = {
1239706f2543Smrg    ProcXvQueryExtension,
1240706f2543Smrg    ProcXvQueryAdaptors,
1241706f2543Smrg    ProcXvQueryEncodings,
1242706f2543Smrg    ProcXvGrabPort,
1243706f2543Smrg    ProcXvUngrabPort,
1244706f2543Smrg    ProcXvPutVideo,
1245706f2543Smrg    ProcXvPutStill,
1246706f2543Smrg    ProcXvGetVideo,
1247706f2543Smrg    ProcXvGetStill,
1248706f2543Smrg    ProcXvStopVideo,
1249706f2543Smrg    ProcXvSelectVideoNotify,
1250706f2543Smrg    ProcXvSelectPortNotify,
1251706f2543Smrg    ProcXvQueryBestSize,
1252706f2543Smrg    ProcXvSetPortAttribute,
1253706f2543Smrg    ProcXvGetPortAttribute,
1254706f2543Smrg    ProcXvQueryPortAttributes,
1255706f2543Smrg    ProcXvListImageFormats,
1256706f2543Smrg    ProcXvQueryImageAttributes,
1257706f2543Smrg    ProcXvPutImage,
1258706f2543Smrg    ProcXvShmPutImage,
1259706f2543Smrg};
1260706f2543Smrg
1261706f2543Smrgint
1262706f2543SmrgProcXvDispatch(ClientPtr client)
1263706f2543Smrg{
1264706f2543Smrg  REQUEST(xReq);
1265706f2543Smrg
1266706f2543Smrg  UpdateCurrentTime();
1267706f2543Smrg
1268706f2543Smrg  if (stuff->data >= xvNumRequests) {
1269706f2543Smrg    SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
1270706f2543Smrg    return BadRequest;
1271706f2543Smrg  }
1272706f2543Smrg
1273706f2543Smrg  return XvProcVector[stuff->data](client);
1274706f2543Smrg}
1275706f2543Smrg
1276706f2543Smrg/* Swapped Procs */
1277706f2543Smrg
1278706f2543Smrgstatic int
1279706f2543SmrgSProcXvQueryExtension(ClientPtr client)
1280706f2543Smrg{
1281706f2543Smrg  char n;
1282706f2543Smrg  REQUEST(xvQueryExtensionReq);
1283706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryExtensionReq);
1284706f2543Smrg  swaps(&stuff->length, n);
1285706f2543Smrg  return XvProcVector[xv_QueryExtension](client);
1286706f2543Smrg}
1287706f2543Smrg
1288706f2543Smrgstatic int
1289706f2543SmrgSProcXvQueryAdaptors(ClientPtr client)
1290706f2543Smrg{
1291706f2543Smrg  char n;
1292706f2543Smrg  REQUEST(xvQueryAdaptorsReq);
1293706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryAdaptorsReq);
1294706f2543Smrg  swaps(&stuff->length, n);
1295706f2543Smrg  swapl(&stuff->window, n);
1296706f2543Smrg  return XvProcVector[xv_QueryAdaptors](client);
1297706f2543Smrg}
1298706f2543Smrg
1299706f2543Smrgstatic int
1300706f2543SmrgSProcXvQueryEncodings(ClientPtr client)
1301706f2543Smrg{
1302706f2543Smrg  char n;
1303706f2543Smrg  REQUEST(xvQueryEncodingsReq);
1304706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
1305706f2543Smrg  swaps(&stuff->length, n);
1306706f2543Smrg  swapl(&stuff->port, n);
1307706f2543Smrg  return XvProcVector[xv_QueryEncodings](client);
1308706f2543Smrg}
1309706f2543Smrg
1310706f2543Smrgstatic int
1311706f2543SmrgSProcXvGrabPort(ClientPtr client)
1312706f2543Smrg{
1313706f2543Smrg  char n;
1314706f2543Smrg  REQUEST(xvGrabPortReq);
1315706f2543Smrg  REQUEST_SIZE_MATCH(xvGrabPortReq);
1316706f2543Smrg  swaps(&stuff->length, n);
1317706f2543Smrg  swapl(&stuff->port, n);
1318706f2543Smrg  swapl(&stuff->time, n);
1319706f2543Smrg  return XvProcVector[xv_GrabPort](client);
1320706f2543Smrg}
1321706f2543Smrg
1322706f2543Smrgstatic int
1323706f2543SmrgSProcXvUngrabPort(ClientPtr client)
1324706f2543Smrg{
1325706f2543Smrg  char n;
1326706f2543Smrg  REQUEST(xvUngrabPortReq);
1327706f2543Smrg  REQUEST_SIZE_MATCH(xvUngrabPortReq);
1328706f2543Smrg  swaps(&stuff->length, n);
1329706f2543Smrg  swapl(&stuff->port, n);
1330706f2543Smrg  swapl(&stuff->time, n);
1331706f2543Smrg  return XvProcVector[xv_UngrabPort](client);
1332706f2543Smrg}
1333706f2543Smrg
1334706f2543Smrgstatic int
1335706f2543SmrgSProcXvPutVideo(ClientPtr client)
1336706f2543Smrg{
1337706f2543Smrg  char n;
1338706f2543Smrg  REQUEST(xvPutVideoReq);
1339706f2543Smrg  REQUEST_SIZE_MATCH(xvPutVideoReq);
1340706f2543Smrg  swaps(&stuff->length, n);
1341706f2543Smrg  swapl(&stuff->port, n);
1342706f2543Smrg  swapl(&stuff->drawable, n);
1343706f2543Smrg  swapl(&stuff->gc, n);
1344706f2543Smrg  swaps(&stuff->vid_x, n);
1345706f2543Smrg  swaps(&stuff->vid_y, n);
1346706f2543Smrg  swaps(&stuff->vid_w, n);
1347706f2543Smrg  swaps(&stuff->vid_h, n);
1348706f2543Smrg  swaps(&stuff->drw_x, n);
1349706f2543Smrg  swaps(&stuff->drw_y, n);
1350706f2543Smrg  swaps(&stuff->drw_w, n);
1351706f2543Smrg  swaps(&stuff->drw_h, n);
1352706f2543Smrg  return XvProcVector[xv_PutVideo](client);
1353706f2543Smrg}
1354706f2543Smrg
1355706f2543Smrgstatic int
1356706f2543SmrgSProcXvPutStill(ClientPtr client)
1357706f2543Smrg{
1358706f2543Smrg  char n;
1359706f2543Smrg  REQUEST(xvPutStillReq);
1360706f2543Smrg  REQUEST_SIZE_MATCH(xvPutStillReq);
1361706f2543Smrg  swaps(&stuff->length, n);
1362706f2543Smrg  swapl(&stuff->port, n);
1363706f2543Smrg  swapl(&stuff->drawable, n);
1364706f2543Smrg  swapl(&stuff->gc, n);
1365706f2543Smrg  swaps(&stuff->vid_x, n);
1366706f2543Smrg  swaps(&stuff->vid_y, n);
1367706f2543Smrg  swaps(&stuff->vid_w, n);
1368706f2543Smrg  swaps(&stuff->vid_h, n);
1369706f2543Smrg  swaps(&stuff->drw_x, n);
1370706f2543Smrg  swaps(&stuff->drw_y, n);
1371706f2543Smrg  swaps(&stuff->drw_w, n);
1372706f2543Smrg  swaps(&stuff->drw_h, n);
1373706f2543Smrg  return XvProcVector[xv_PutStill](client);
1374706f2543Smrg}
1375706f2543Smrg
1376706f2543Smrgstatic int
1377706f2543SmrgSProcXvGetVideo(ClientPtr client)
1378706f2543Smrg{
1379706f2543Smrg  char n;
1380706f2543Smrg  REQUEST(xvGetVideoReq);
1381706f2543Smrg  REQUEST_SIZE_MATCH(xvGetVideoReq);
1382706f2543Smrg  swaps(&stuff->length, n);
1383706f2543Smrg  swapl(&stuff->port, n);
1384706f2543Smrg  swapl(&stuff->drawable, n);
1385706f2543Smrg  swapl(&stuff->gc, n);
1386706f2543Smrg  swaps(&stuff->vid_x, n);
1387706f2543Smrg  swaps(&stuff->vid_y, n);
1388706f2543Smrg  swaps(&stuff->vid_w, n);
1389706f2543Smrg  swaps(&stuff->vid_h, n);
1390706f2543Smrg  swaps(&stuff->drw_x, n);
1391706f2543Smrg  swaps(&stuff->drw_y, n);
1392706f2543Smrg  swaps(&stuff->drw_w, n);
1393706f2543Smrg  swaps(&stuff->drw_h, n);
1394706f2543Smrg  return XvProcVector[xv_GetVideo](client);
1395706f2543Smrg}
1396706f2543Smrg
1397706f2543Smrgstatic int
1398706f2543SmrgSProcXvGetStill(ClientPtr client)
1399706f2543Smrg{
1400706f2543Smrg  char n;
1401706f2543Smrg  REQUEST(xvGetStillReq);
1402706f2543Smrg  REQUEST_SIZE_MATCH(xvGetStillReq);
1403706f2543Smrg  swaps(&stuff->length, n);
1404706f2543Smrg  swapl(&stuff->port, n);
1405706f2543Smrg  swapl(&stuff->drawable, n);
1406706f2543Smrg  swapl(&stuff->gc, n);
1407706f2543Smrg  swaps(&stuff->vid_x, n);
1408706f2543Smrg  swaps(&stuff->vid_y, n);
1409706f2543Smrg  swaps(&stuff->vid_w, n);
1410706f2543Smrg  swaps(&stuff->vid_h, n);
1411706f2543Smrg  swaps(&stuff->drw_x, n);
1412706f2543Smrg  swaps(&stuff->drw_y, n);
1413706f2543Smrg  swaps(&stuff->drw_w, n);
1414706f2543Smrg  swaps(&stuff->drw_h, n);
1415706f2543Smrg  return XvProcVector[xv_GetStill](client);
1416706f2543Smrg}
1417706f2543Smrg
1418706f2543Smrgstatic int
1419706f2543SmrgSProcXvPutImage(ClientPtr client)
1420706f2543Smrg{
1421706f2543Smrg  char n;
1422706f2543Smrg  REQUEST(xvPutImageReq);
1423706f2543Smrg  REQUEST_AT_LEAST_SIZE(xvPutImageReq);
1424706f2543Smrg  swaps(&stuff->length, n);
1425706f2543Smrg  swapl(&stuff->port, n);
1426706f2543Smrg  swapl(&stuff->drawable, n);
1427706f2543Smrg  swapl(&stuff->gc, n);
1428706f2543Smrg  swapl(&stuff->id, n);
1429706f2543Smrg  swaps(&stuff->src_x, n);
1430706f2543Smrg  swaps(&stuff->src_y, n);
1431706f2543Smrg  swaps(&stuff->src_w, n);
1432706f2543Smrg  swaps(&stuff->src_h, n);
1433706f2543Smrg  swaps(&stuff->drw_x, n);
1434706f2543Smrg  swaps(&stuff->drw_y, n);
1435706f2543Smrg  swaps(&stuff->drw_w, n);
1436706f2543Smrg  swaps(&stuff->drw_h, n);
1437706f2543Smrg  swaps(&stuff->width, n);
1438706f2543Smrg  swaps(&stuff->height, n);
1439706f2543Smrg  return XvProcVector[xv_PutImage](client);
1440706f2543Smrg}
1441706f2543Smrg
1442706f2543Smrg#ifdef MITSHM
1443706f2543Smrgstatic int
1444706f2543SmrgSProcXvShmPutImage(ClientPtr client)
1445706f2543Smrg{
1446706f2543Smrg  char n;
1447706f2543Smrg  REQUEST(xvShmPutImageReq);
1448706f2543Smrg  REQUEST_SIZE_MATCH(xvShmPutImageReq);
1449706f2543Smrg  swaps(&stuff->length, n);
1450706f2543Smrg  swapl(&stuff->port, n);
1451706f2543Smrg  swapl(&stuff->drawable, n);
1452706f2543Smrg  swapl(&stuff->gc, n);
1453706f2543Smrg  swapl(&stuff->shmseg, n);
1454706f2543Smrg  swapl(&stuff->id, n);
1455706f2543Smrg  swapl(&stuff->offset, n);
1456706f2543Smrg  swaps(&stuff->src_x, n);
1457706f2543Smrg  swaps(&stuff->src_y, n);
1458706f2543Smrg  swaps(&stuff->src_w, n);
1459706f2543Smrg  swaps(&stuff->src_h, n);
1460706f2543Smrg  swaps(&stuff->drw_x, n);
1461706f2543Smrg  swaps(&stuff->drw_y, n);
1462706f2543Smrg  swaps(&stuff->drw_w, n);
1463706f2543Smrg  swaps(&stuff->drw_h, n);
1464706f2543Smrg  swaps(&stuff->width, n);
1465706f2543Smrg  swaps(&stuff->height, n);
1466706f2543Smrg  return XvProcVector[xv_ShmPutImage](client);
1467706f2543Smrg}
1468706f2543Smrg#else /* MITSHM */
1469706f2543Smrg#define SProcXvShmPutImage ProcXvShmPutImage
1470706f2543Smrg#endif
1471706f2543Smrg
1472706f2543Smrgstatic int
1473706f2543SmrgSProcXvSelectVideoNotify(ClientPtr client)
1474706f2543Smrg{
1475706f2543Smrg  char n;
1476706f2543Smrg  REQUEST(xvSelectVideoNotifyReq);
1477706f2543Smrg  REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq);
1478706f2543Smrg  swaps(&stuff->length, n);
1479706f2543Smrg  swapl(&stuff->drawable, n);
1480706f2543Smrg  return XvProcVector[xv_SelectVideoNotify](client);
1481706f2543Smrg}
1482706f2543Smrg
1483706f2543Smrgstatic int
1484706f2543SmrgSProcXvSelectPortNotify(ClientPtr client)
1485706f2543Smrg{
1486706f2543Smrg  char n;
1487706f2543Smrg  REQUEST(xvSelectPortNotifyReq);
1488706f2543Smrg  REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
1489706f2543Smrg  swaps(&stuff->length, n);
1490706f2543Smrg  swapl(&stuff->port, n);
1491706f2543Smrg  return XvProcVector[xv_SelectPortNotify](client);
1492706f2543Smrg}
1493706f2543Smrg
1494706f2543Smrgstatic int
1495706f2543SmrgSProcXvStopVideo(ClientPtr client)
1496706f2543Smrg{
1497706f2543Smrg  char n;
1498706f2543Smrg  REQUEST(xvStopVideoReq);
1499706f2543Smrg  REQUEST_SIZE_MATCH(xvStopVideoReq);
1500706f2543Smrg  swaps(&stuff->length, n);
1501706f2543Smrg  swapl(&stuff->port, n);
1502706f2543Smrg  swapl(&stuff->drawable, n);
1503706f2543Smrg  return XvProcVector[xv_StopVideo](client);
1504706f2543Smrg}
1505706f2543Smrg
1506706f2543Smrgstatic int
1507706f2543SmrgSProcXvSetPortAttribute(ClientPtr client)
1508706f2543Smrg{
1509706f2543Smrg  char n;
1510706f2543Smrg  REQUEST(xvSetPortAttributeReq);
1511706f2543Smrg  REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
1512706f2543Smrg  swaps(&stuff->length, n);
1513706f2543Smrg  swapl(&stuff->port, n);
1514706f2543Smrg  swapl(&stuff->attribute, n);
1515706f2543Smrg  swapl(&stuff->value, n);
1516706f2543Smrg  return XvProcVector[xv_SetPortAttribute](client);
1517706f2543Smrg}
1518706f2543Smrg
1519706f2543Smrgstatic int
1520706f2543SmrgSProcXvGetPortAttribute(ClientPtr client)
1521706f2543Smrg{
1522706f2543Smrg  char n;
1523706f2543Smrg  REQUEST(xvGetPortAttributeReq);
1524706f2543Smrg  REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
1525706f2543Smrg  swaps(&stuff->length, n);
1526706f2543Smrg  swapl(&stuff->port, n);
1527706f2543Smrg  swapl(&stuff->attribute, n);
1528706f2543Smrg  return XvProcVector[xv_GetPortAttribute](client);
1529706f2543Smrg}
1530706f2543Smrg
1531706f2543Smrgstatic int
1532706f2543SmrgSProcXvQueryBestSize(ClientPtr client)
1533706f2543Smrg{
1534706f2543Smrg  char n;
1535706f2543Smrg  REQUEST(xvQueryBestSizeReq);
1536706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
1537706f2543Smrg  swaps(&stuff->length, n);
1538706f2543Smrg  swapl(&stuff->port, n);
1539706f2543Smrg  swaps(&stuff->vid_w, n);
1540706f2543Smrg  swaps(&stuff->vid_h, n);
1541706f2543Smrg  swaps(&stuff->drw_w, n);
1542706f2543Smrg  swaps(&stuff->drw_h, n);
1543706f2543Smrg  return XvProcVector[xv_QueryBestSize](client);
1544706f2543Smrg}
1545706f2543Smrg
1546706f2543Smrgstatic int
1547706f2543SmrgSProcXvQueryPortAttributes(ClientPtr client)
1548706f2543Smrg{
1549706f2543Smrg  char n;
1550706f2543Smrg  REQUEST(xvQueryPortAttributesReq);
1551706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
1552706f2543Smrg  swaps(&stuff->length, n);
1553706f2543Smrg  swapl(&stuff->port, n);
1554706f2543Smrg  return XvProcVector[xv_QueryPortAttributes](client);
1555706f2543Smrg}
1556706f2543Smrg
1557706f2543Smrgstatic int
1558706f2543SmrgSProcXvQueryImageAttributes(ClientPtr client)
1559706f2543Smrg{
1560706f2543Smrg  char n;
1561706f2543Smrg  REQUEST(xvQueryImageAttributesReq);
1562706f2543Smrg  REQUEST_SIZE_MATCH(xvQueryImageAttributesReq);
1563706f2543Smrg  swaps(&stuff->length, n);
1564706f2543Smrg  swapl(&stuff->port, n);
1565706f2543Smrg  swapl(&stuff->id, n);
1566706f2543Smrg  swaps(&stuff->width, n);
1567706f2543Smrg  swaps(&stuff->height, n);
1568706f2543Smrg  return XvProcVector[xv_QueryImageAttributes](client);
1569706f2543Smrg}
1570706f2543Smrg
1571706f2543Smrgstatic int
1572706f2543SmrgSProcXvListImageFormats(ClientPtr client)
1573706f2543Smrg{
1574706f2543Smrg  char n;
1575706f2543Smrg  REQUEST(xvListImageFormatsReq);
1576706f2543Smrg  REQUEST_SIZE_MATCH(xvListImageFormatsReq);
1577706f2543Smrg  swaps(&stuff->length, n);
1578706f2543Smrg  swapl(&stuff->port, n);
1579706f2543Smrg  return XvProcVector[xv_ListImageFormats](client);
1580706f2543Smrg}
1581706f2543Smrg
1582706f2543Smrgstatic int (*SXvProcVector[xvNumRequests])(ClientPtr) = {
1583706f2543Smrg    SProcXvQueryExtension,
1584706f2543Smrg    SProcXvQueryAdaptors,
1585706f2543Smrg    SProcXvQueryEncodings,
1586706f2543Smrg    SProcXvGrabPort,
1587706f2543Smrg    SProcXvUngrabPort,
1588706f2543Smrg    SProcXvPutVideo,
1589706f2543Smrg    SProcXvPutStill,
1590706f2543Smrg    SProcXvGetVideo,
1591706f2543Smrg    SProcXvGetStill,
1592706f2543Smrg    SProcXvStopVideo,
1593706f2543Smrg    SProcXvSelectVideoNotify,
1594706f2543Smrg    SProcXvSelectPortNotify,
1595706f2543Smrg    SProcXvQueryBestSize,
1596706f2543Smrg    SProcXvSetPortAttribute,
1597706f2543Smrg    SProcXvGetPortAttribute,
1598706f2543Smrg    SProcXvQueryPortAttributes,
1599706f2543Smrg    SProcXvListImageFormats,
1600706f2543Smrg    SProcXvQueryImageAttributes,
1601706f2543Smrg    SProcXvPutImage,
1602706f2543Smrg    SProcXvShmPutImage,
1603706f2543Smrg};
1604706f2543Smrg
1605706f2543Smrgint
1606706f2543SmrgSProcXvDispatch(ClientPtr client)
1607706f2543Smrg{
1608706f2543Smrg  REQUEST(xReq);
1609706f2543Smrg
1610706f2543Smrg  UpdateCurrentTime();
1611706f2543Smrg
1612706f2543Smrg  if (stuff->data >= xvNumRequests) {
1613706f2543Smrg    SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
1614706f2543Smrg    return BadRequest;
1615706f2543Smrg  }
1616706f2543Smrg
1617706f2543Smrg  return SXvProcVector[stuff->data](client);
1618706f2543Smrg}
1619706f2543Smrg
1620706f2543Smrg#ifdef PANORAMIX
1621706f2543Smrgstatic int
1622706f2543SmrgXineramaXvStopVideo(ClientPtr client)
1623706f2543Smrg{
1624706f2543Smrg   int result, i;
1625706f2543Smrg   PanoramiXRes *draw, *port;
1626706f2543Smrg   REQUEST(xvStopVideoReq);
1627706f2543Smrg   REQUEST_SIZE_MATCH(xvStopVideoReq);
1628706f2543Smrg
1629706f2543Smrg   result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
1630706f2543Smrg				     XRC_DRAWABLE, client, DixWriteAccess);
1631706f2543Smrg   if (result != Success)
1632706f2543Smrg       return (result == BadValue) ? BadDrawable : result;
1633706f2543Smrg
1634706f2543Smrg   result = dixLookupResourceByType((pointer *)&port, stuff->port,
1635706f2543Smrg				    XvXRTPort, client, DixReadAccess);
1636706f2543Smrg   if (result != Success)
1637706f2543Smrg       return result;
1638706f2543Smrg
1639706f2543Smrg   FOR_NSCREENS_BACKWARD(i) {
1640706f2543Smrg	if(port->info[i].id) {
1641706f2543Smrg	   stuff->drawable = draw->info[i].id;
1642706f2543Smrg	   stuff->port = port->info[i].id;
1643706f2543Smrg	   result = ProcXvStopVideo(client);
1644706f2543Smrg     	}
1645706f2543Smrg   }
1646706f2543Smrg
1647706f2543Smrg   return result;
1648706f2543Smrg}
1649706f2543Smrg
1650706f2543Smrgstatic int
1651706f2543SmrgXineramaXvSetPortAttribute(ClientPtr client)
1652706f2543Smrg{
1653706f2543Smrg    REQUEST(xvSetPortAttributeReq);
1654706f2543Smrg    PanoramiXRes *port;
1655706f2543Smrg    int result, i;
1656706f2543Smrg
1657706f2543Smrg    REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
1658706f2543Smrg
1659706f2543Smrg    result = dixLookupResourceByType((pointer *)&port, stuff->port,
1660706f2543Smrg				     XvXRTPort, client, DixReadAccess);
1661706f2543Smrg    if (result != Success)
1662706f2543Smrg	return result;
1663706f2543Smrg
1664706f2543Smrg    FOR_NSCREENS_BACKWARD(i) {
1665706f2543Smrg	if(port->info[i].id) {
1666706f2543Smrg	   stuff->port = port->info[i].id;
1667706f2543Smrg	   result = ProcXvSetPortAttribute(client);
1668706f2543Smrg	}
1669706f2543Smrg    }
1670706f2543Smrg    return result;
1671706f2543Smrg}
1672706f2543Smrg
1673706f2543Smrg#ifdef MITSHM
1674706f2543Smrgstatic int
1675706f2543SmrgXineramaXvShmPutImage(ClientPtr client)
1676706f2543Smrg{
1677706f2543Smrg    REQUEST(xvShmPutImageReq);
1678706f2543Smrg    PanoramiXRes *draw, *gc, *port;
167948a68b89Smrg    Bool send_event;
1680706f2543Smrg    Bool isRoot;
1681706f2543Smrg    int result, i, x, y;
1682706f2543Smrg
1683706f2543Smrg    REQUEST_SIZE_MATCH(xvShmPutImageReq);
1684706f2543Smrg
168548a68b89Smrg    send_event = stuff->send_event;
168648a68b89Smrg
1687706f2543Smrg    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
1688706f2543Smrg				      XRC_DRAWABLE, client, DixWriteAccess);
1689706f2543Smrg    if (result != Success)
1690706f2543Smrg	return (result == BadValue) ? BadDrawable : result;
1691706f2543Smrg
1692706f2543Smrg    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
1693706f2543Smrg				     XRT_GC, client, DixReadAccess);
1694706f2543Smrg    if (result != Success)
1695706f2543Smrg        return result;
1696706f2543Smrg
1697706f2543Smrg    result = dixLookupResourceByType((pointer *)&port, stuff->port,
1698706f2543Smrg				     XvXRTPort, client, DixReadAccess);
1699706f2543Smrg    if (result != Success)
1700706f2543Smrg	return result;
1701706f2543Smrg
1702706f2543Smrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
1703706f2543Smrg
1704706f2543Smrg    x = stuff->drw_x;
1705706f2543Smrg    y = stuff->drw_y;
1706706f2543Smrg
1707706f2543Smrg    FOR_NSCREENS_BACKWARD(i) {
1708706f2543Smrg	if(port->info[i].id) {
1709706f2543Smrg	   stuff->drawable = draw->info[i].id;
1710706f2543Smrg	   stuff->port = port->info[i].id;
1711706f2543Smrg	   stuff->gc = gc->info[i].id;
1712706f2543Smrg	   stuff->drw_x = x;
1713706f2543Smrg	   stuff->drw_y = y;
1714706f2543Smrg	   if(isRoot) {
1715706f2543Smrg		stuff->drw_x -= screenInfo.screens[i]->x;
1716706f2543Smrg		stuff->drw_y -= screenInfo.screens[i]->y;
1717706f2543Smrg	   }
1718706f2543Smrg	   stuff->send_event = (send_event && !i) ? 1 : 0;
1719706f2543Smrg
1720706f2543Smrg	   result = ProcXvShmPutImage(client);
1721706f2543Smrg	}
1722706f2543Smrg    }
1723706f2543Smrg    return result;
1724706f2543Smrg}
1725706f2543Smrg#else
1726706f2543Smrg#define XineramaXvShmPutImage ProcXvShmPutImage
1727706f2543Smrg#endif
1728706f2543Smrg
1729706f2543Smrgstatic int
1730706f2543SmrgXineramaXvPutImage(ClientPtr client)
1731706f2543Smrg{
1732706f2543Smrg    REQUEST(xvPutImageReq);
1733706f2543Smrg    PanoramiXRes *draw, *gc, *port;
1734706f2543Smrg    Bool isRoot;
1735706f2543Smrg    int result, i, x, y;
1736706f2543Smrg
1737706f2543Smrg    REQUEST_AT_LEAST_SIZE(xvPutImageReq);
1738706f2543Smrg
1739706f2543Smrg    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
1740706f2543Smrg				      XRC_DRAWABLE, client, DixWriteAccess);
1741706f2543Smrg    if (result != Success)
1742706f2543Smrg	return (result == BadValue) ? BadDrawable : result;
1743706f2543Smrg
1744706f2543Smrg    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
1745706f2543Smrg				     XRT_GC, client, DixReadAccess);
1746706f2543Smrg    if (result != Success)
1747706f2543Smrg        return result;
1748706f2543Smrg
1749706f2543Smrg    result = dixLookupResourceByType((pointer *)&port, stuff->port,
1750706f2543Smrg				     XvXRTPort, client, DixReadAccess);
1751706f2543Smrg    if (result != Success)
1752706f2543Smrg	return result;
1753706f2543Smrg
1754706f2543Smrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
1755706f2543Smrg
1756706f2543Smrg    x = stuff->drw_x;
1757706f2543Smrg    y = stuff->drw_y;
1758706f2543Smrg
1759706f2543Smrg    FOR_NSCREENS_BACKWARD(i) {
1760706f2543Smrg	if(port->info[i].id) {
1761706f2543Smrg	   stuff->drawable = draw->info[i].id;
1762706f2543Smrg	   stuff->port = port->info[i].id;
1763706f2543Smrg	   stuff->gc = gc->info[i].id;
1764706f2543Smrg	   stuff->drw_x = x;
1765706f2543Smrg	   stuff->drw_y = y;
1766706f2543Smrg	   if(isRoot) {
1767706f2543Smrg		stuff->drw_x -= screenInfo.screens[i]->x;
1768706f2543Smrg		stuff->drw_y -= screenInfo.screens[i]->y;
1769706f2543Smrg	   }
1770706f2543Smrg
1771706f2543Smrg	   result = ProcXvPutImage(client);
1772706f2543Smrg	}
1773706f2543Smrg    }
1774706f2543Smrg    return result;
1775706f2543Smrg}
1776706f2543Smrg
1777706f2543Smrgstatic int
1778706f2543SmrgXineramaXvPutVideo(ClientPtr client)
1779706f2543Smrg{
1780706f2543Smrg    REQUEST(xvPutImageReq);
1781706f2543Smrg    PanoramiXRes *draw, *gc, *port;
1782706f2543Smrg    Bool isRoot;
1783706f2543Smrg    int result, i, x, y;
1784706f2543Smrg
1785706f2543Smrg    REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
1786706f2543Smrg
1787706f2543Smrg    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
1788706f2543Smrg				      XRC_DRAWABLE, client, DixWriteAccess);
1789706f2543Smrg    if (result != Success)
1790706f2543Smrg	return (result == BadValue) ? BadDrawable : result;
1791706f2543Smrg
1792706f2543Smrg    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
1793706f2543Smrg				     XRT_GC, client, DixReadAccess);
1794706f2543Smrg    if (result != Success)
1795706f2543Smrg        return result;
1796706f2543Smrg
1797706f2543Smrg    result = dixLookupResourceByType((pointer *)&port, stuff->port,
1798706f2543Smrg				     XvXRTPort, client, DixReadAccess);
1799706f2543Smrg    if (result != Success)
1800706f2543Smrg	return result;
1801706f2543Smrg
1802706f2543Smrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
1803706f2543Smrg
1804706f2543Smrg    x = stuff->drw_x;
1805706f2543Smrg    y = stuff->drw_y;
1806706f2543Smrg
1807706f2543Smrg    FOR_NSCREENS_BACKWARD(i) {
1808706f2543Smrg        if(port->info[i].id) {
1809706f2543Smrg           stuff->drawable = draw->info[i].id;
1810706f2543Smrg           stuff->port = port->info[i].id;
1811706f2543Smrg           stuff->gc = gc->info[i].id;
1812706f2543Smrg           stuff->drw_x = x;
1813706f2543Smrg           stuff->drw_y = y;
1814706f2543Smrg           if(isRoot) {
1815706f2543Smrg                stuff->drw_x -= screenInfo.screens[i]->x;
1816706f2543Smrg                stuff->drw_y -= screenInfo.screens[i]->y;
1817706f2543Smrg           }
1818706f2543Smrg
1819706f2543Smrg           result = ProcXvPutVideo(client);
1820706f2543Smrg        }
1821706f2543Smrg    }
1822706f2543Smrg    return result;
1823706f2543Smrg}
1824706f2543Smrg
1825706f2543Smrgstatic int
1826706f2543SmrgXineramaXvPutStill(ClientPtr client)
1827706f2543Smrg{
1828706f2543Smrg    REQUEST(xvPutImageReq);
1829706f2543Smrg    PanoramiXRes *draw, *gc, *port;
1830706f2543Smrg    Bool isRoot;
1831706f2543Smrg    int result, i, x, y;
1832706f2543Smrg
1833706f2543Smrg    REQUEST_AT_LEAST_SIZE(xvPutImageReq);
1834706f2543Smrg
1835706f2543Smrg    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
1836706f2543Smrg				      XRC_DRAWABLE, client, DixWriteAccess);
1837706f2543Smrg    if (result != Success)
1838706f2543Smrg	return (result == BadValue) ? BadDrawable : result;
1839706f2543Smrg
1840706f2543Smrg    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
1841706f2543Smrg				     XRT_GC, client, DixReadAccess);
1842706f2543Smrg    if (result != Success)
1843706f2543Smrg        return result;
1844706f2543Smrg
1845706f2543Smrg    result = dixLookupResourceByType((pointer *)&port, stuff->port,
1846706f2543Smrg				     XvXRTPort, client, DixReadAccess);
1847706f2543Smrg    if (result != Success)
1848706f2543Smrg	return result;
1849706f2543Smrg
1850706f2543Smrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
1851706f2543Smrg
1852706f2543Smrg    x = stuff->drw_x;
1853706f2543Smrg    y = stuff->drw_y;
1854706f2543Smrg
1855706f2543Smrg    FOR_NSCREENS_BACKWARD(i) {
1856706f2543Smrg        if(port->info[i].id) {
1857706f2543Smrg           stuff->drawable = draw->info[i].id;
1858706f2543Smrg           stuff->port = port->info[i].id;
1859706f2543Smrg           stuff->gc = gc->info[i].id;
1860706f2543Smrg           stuff->drw_x = x;
1861706f2543Smrg           stuff->drw_y = y;
1862706f2543Smrg           if(isRoot) {
1863706f2543Smrg                stuff->drw_x -= screenInfo.screens[i]->x;
1864706f2543Smrg                stuff->drw_y -= screenInfo.screens[i]->y;
1865706f2543Smrg           }
1866706f2543Smrg
1867706f2543Smrg           result = ProcXvPutStill(client);
1868706f2543Smrg        }
1869706f2543Smrg    }
1870706f2543Smrg    return result;
1871706f2543Smrg}
1872706f2543Smrg
1873706f2543Smrgstatic Bool
1874706f2543SmrgisImageAdaptor(XvAdaptorPtr pAdapt)
1875706f2543Smrg{
1876706f2543Smrg    return (pAdapt->type & XvImageMask) && (pAdapt->nImages > 0);
1877706f2543Smrg}
1878706f2543Smrg
1879706f2543Smrgstatic Bool
1880706f2543SmrghasOverlay(XvAdaptorPtr pAdapt)
1881706f2543Smrg{
1882706f2543Smrg    int i;
1883706f2543Smrg    for(i = 0; i < pAdapt->nAttributes; i++)
1884706f2543Smrg	if(!strcmp(pAdapt->pAttributes[i].name, "XV_COLORKEY"))
1885706f2543Smrg	    return TRUE;
1886706f2543Smrg    return FALSE;
1887706f2543Smrg}
1888706f2543Smrg
1889706f2543Smrgstatic XvAdaptorPtr
1890706f2543SmrgmatchAdaptor(ScreenPtr pScreen, XvAdaptorPtr refAdapt, Bool isOverlay)
1891706f2543Smrg{
1892706f2543Smrg    int i;
1893706f2543Smrg    XvScreenPtr xvsp = dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey());
1894706f2543Smrg    /* Do not try to go on if xv is not supported on this screen */
1895706f2543Smrg    if(xvsp == NULL)
1896706f2543Smrg	return NULL;
1897706f2543Smrg
1898706f2543Smrg    /* if the adaptor has the same name it's a perfect match */
1899706f2543Smrg    for(i = 0; i < xvsp->nAdaptors; i++) {
1900706f2543Smrg	XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
1901706f2543Smrg	if(!strcmp(refAdapt->name, pAdapt->name))
1902706f2543Smrg	    return pAdapt;
1903706f2543Smrg    }
1904706f2543Smrg
1905706f2543Smrg    /* otherwise we only look for XvImage adaptors */
1906706f2543Smrg    if(!isImageAdaptor(refAdapt))
1907706f2543Smrg	return NULL;
1908706f2543Smrg
1909706f2543Smrg    /* prefer overlay/overlay non-overlay/non-overlay pairing */
1910706f2543Smrg    for(i = 0; i < xvsp->nAdaptors; i++) {
1911706f2543Smrg	XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
1912706f2543Smrg	if(isImageAdaptor(pAdapt) && isOverlay == hasOverlay(pAdapt))
1913706f2543Smrg	    return pAdapt;
1914706f2543Smrg    }
1915706f2543Smrg
1916706f2543Smrg    /* but we'll take any XvImage pairing if we can get it */
1917706f2543Smrg    for(i = 0; i < xvsp->nAdaptors; i++) {
1918706f2543Smrg	XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
1919706f2543Smrg	if(isImageAdaptor(pAdapt))
1920706f2543Smrg	    return pAdapt;
1921706f2543Smrg    }
1922706f2543Smrg    return NULL;
1923706f2543Smrg}
1924706f2543Smrg
1925706f2543Smrgvoid XineramifyXv(void)
1926706f2543Smrg{
1927706f2543Smrg   XvScreenPtr xvsp0 = dixLookupPrivate(&screenInfo.screens[0]->devPrivates, XvGetScreenKey());
1928706f2543Smrg   XvAdaptorPtr MatchingAdaptors[MAXSCREENS];
1929706f2543Smrg   int i, j, k;
1930706f2543Smrg
1931706f2543Smrg   XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort");
1932706f2543Smrg
1933706f2543Smrg   if (!xvsp0 || !XvXRTPort) return;
1934706f2543Smrg   SetResourceTypeErrorValue(XvXRTPort, _XvBadPort);
1935706f2543Smrg
1936706f2543Smrg   for(i = 0; i < xvsp0->nAdaptors; i++) {
1937706f2543Smrg      Bool isOverlay;
1938706f2543Smrg      XvAdaptorPtr refAdapt = xvsp0->pAdaptors + i;
1939706f2543Smrg      if(!(refAdapt->type & XvInputMask)) continue;
1940706f2543Smrg
1941706f2543Smrg      MatchingAdaptors[0] = refAdapt;
1942706f2543Smrg      isOverlay = hasOverlay(refAdapt);
1943706f2543Smrg      for(j = 1; j < PanoramiXNumScreens; j++)
1944706f2543Smrg	 MatchingAdaptors[j] = matchAdaptor(screenInfo.screens[j], refAdapt, isOverlay);
1945706f2543Smrg
1946706f2543Smrg      /* now create a resource for each port */
1947706f2543Smrg      for(j = 0; j < refAdapt->nPorts; j++) {
1948706f2543Smrg	 PanoramiXRes *port = malloc(sizeof(PanoramiXRes));
1949706f2543Smrg	 if(!port)
1950706f2543Smrg	    break;
1951706f2543Smrg
1952706f2543Smrg	 for(k = 0; k < PanoramiXNumScreens; k++) {
1953706f2543Smrg	    if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j))
1954706f2543Smrg		port->info[k].id = MatchingAdaptors[k]->base_id + j;
1955706f2543Smrg	    else
1956706f2543Smrg		port->info[k].id = 0;
1957706f2543Smrg	 }
1958706f2543Smrg	 AddResource(port->info[0].id, XvXRTPort, port);
1959706f2543Smrg      }
1960706f2543Smrg   }
1961706f2543Smrg
1962706f2543Smrg   /* munge the dispatch vector */
1963706f2543Smrg   XvProcVector[xv_PutVideo]		= XineramaXvPutVideo;
1964706f2543Smrg   XvProcVector[xv_PutStill]		= XineramaXvPutStill;
1965706f2543Smrg   XvProcVector[xv_StopVideo]		= XineramaXvStopVideo;
1966706f2543Smrg   XvProcVector[xv_SetPortAttribute]	= XineramaXvSetPortAttribute;
1967706f2543Smrg   XvProcVector[xv_PutImage]		= XineramaXvPutImage;
1968706f2543Smrg   XvProcVector[xv_ShmPutImage]		= XineramaXvShmPutImage;
1969706f2543Smrg}
1970706f2543Smrg#endif /* PANORAMIX */
1971706f2543Smrg
1972706f2543Smrgvoid
1973706f2543SmrgXvResetProcVector(void)
1974706f2543Smrg{
1975706f2543Smrg#ifdef PANORAMIX
1976706f2543Smrg   XvProcVector[xv_PutVideo]		= ProcXvPutVideo;
1977706f2543Smrg   XvProcVector[xv_PutStill]		= ProcXvPutStill;
1978706f2543Smrg   XvProcVector[xv_StopVideo]		= ProcXvStopVideo;
1979706f2543Smrg   XvProcVector[xv_SetPortAttribute]	= ProcXvSetPortAttribute;
1980706f2543Smrg   XvProcVector[xv_PutImage]		= ProcXvPutImage;
1981706f2543Smrg   XvProcVector[xv_ShmPutImage]		= ProcXvShmPutImage;
1982706f2543Smrg#endif
1983706f2543Smrg}
1984