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