static XvAdaptorPtr matchAdaptor(ScreenPtr pScreen, XvAdaptorPtr refAdapt, Bool isOverlay) { int i; XvScreenPtr xvsp = dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey()); /* Do not try to go on if xv is not supported on this screen */ if(xvsp == NULL) return NULL; /* if the adaptor has the same name it's a perfect match */ for(i = 0; i < xvsp->nAdaptors; i++) { XvAdaptorPtr pAdapt = xvsp->pAdaptors + i; if(!strcmp(refAdapt->name, pAdapt->name)) return pAdapt; } /* otherwise we only look for XvImage adaptors */ if(!isImageAdaptor(refAdapt)) return NULL; /* prefer overlay/overlay non-overlay/non-overlay pairing */ for(i = 0; i < xvsp->nAdaptors; i++) { XvAdaptorPtr pAdapt = xvsp->pAdaptors + i; if(isImageAdaptor(pAdapt) && isOverlay == hasOverlay(pAdapt)) return pAdapt; } /* but we'll take any XvImage pairing if we can get it */ for(i = 0; i < xvsp->nAdaptors; i++) { XvAdaptorPtr pAdapt = xvsp->pAdaptors + i; if(isImageAdaptor(pAdapt)) return pAdapt; } return NULL; }
static void ResourceFreed(CallbackListPtr *list, pointer closure, pointer data) { ResourceStateInfoRec *rinfo = (ResourceStateInfoRec *)data; DevPrivateKey key; ScreenPtr scrn; XvScreenPtr xvsc; XvAdaptorPtr adapt; XvPortPtr port; XvGrabPtr grab; ClientPtr cls[MAXCLIENTS]; int i, j, k, m, n; (void)list; (void)closure; if (rinfo->state == ResourceStateFreeing) { if (rinfo->type == XvRTGrab) { if ((grab = (XvGrabPtr)rinfo->value) != NULL && (key = XvGetScreenKey()) != NULL ) { for (i = 0; i < screenInfo.numScreens; i++) { scrn = screenInfo.screens[i]; xvsc = (XvScreenPtr)dixLookupPrivate(&scrn->devPrivates, key); if (xvsc == NULL) continue; for (j = 0; j < xvsc->nAdaptors; j++) { adapt = xvsc->pAdaptors + j; for (k = 0; k < adapt->nPorts; k++) { port = adapt->pPorts + k; if (grab == &port->grab) { PolicyDebug("Xv port %lu ungrabbed", port->id); m = GetQueuedClients(port->id, cls,MAXCLIENTS); for (n = 0; n < m; n++) ClientUnblock(cls[n]); return; } } /* for port */ } /* for adapt */ } /* for scrn */ PolicyError("Failed to find corresponding port " "when grab resource freed"); } } } }
void XineramifyXv(void) { XvScreenPtr xvsp0 = dixLookupPrivate(&screenInfo.screens[0]->devPrivates, XvGetScreenKey()); XvAdaptorPtr MatchingAdaptors[MAXSCREENS]; int i, j, k; XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort"); if (!xvsp0 || !XvXRTPort) return; SetResourceTypeErrorValue(XvXRTPort, _XvBadPort); for(i = 0; i < xvsp0->nAdaptors; i++) { Bool isOverlay; XvAdaptorPtr refAdapt = xvsp0->pAdaptors + i; if(!(refAdapt->type & XvInputMask)) continue; MatchingAdaptors[0] = refAdapt; isOverlay = hasOverlay(refAdapt); FOR_NSCREENS_FORWARD_SKIP(j) MatchingAdaptors[j] = matchAdaptor(screenInfo.screens[j], refAdapt, isOverlay); /* now create a resource for each port */ for(j = 0; j < refAdapt->nPorts; j++) { PanoramiXRes *port = malloc(sizeof(PanoramiXRes)); if(!port) break; FOR_NSCREENS(k) { if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j)) port->info[k].id = MatchingAdaptors[k]->base_id + j; else port->info[k].id = 0; } AddResource(port->info[0].id, XvXRTPort, port); } } /* munge the dispatch vector */ XvProcVector[xv_PutVideo] = XineramaXvPutVideo; XvProcVector[xv_PutStill] = XineramaXvPutStill; XvProcVector[xv_StopVideo] = XineramaXvStopVideo; XvProcVector[xv_SetPortAttribute] = XineramaXvSetPortAttribute; XvProcVector[xv_PutImage] = XineramaXvPutImage; XvProcVector[xv_ShmPutImage] = XineramaXvShmPutImage; }
void XvideoKillUnathorizedClients(unsigned char adaptor_type, pid_t *AuthorizedClients, int NumberOfClients, pid_t IdleClient) { DevPrivateKey key; ScreenPtr scrn; XvScreenPtr xvsc; XvAdaptorPtr adapt; XvPortPtr port; ClientPtr client; char reason[256]; int i, j, k; if ((key = XvGetScreenKey()) == NULL) return; /* should not happen */ for (i = 0; i < screenInfo.numScreens; i++) { scrn = screenInfo.screens[i]; if (scrn != NULL) { xvsc = (XvScreenPtr)dixLookupPrivate(&scrn->devPrivates, key); if (xvsc != NULL) { for (j = 0; j < xvsc->nAdaptors; j++) { adapt = xvsc->pAdaptors + j; if ((adaptor_type & adapt->type) != 0) { for (k = 0; k < adapt->nPorts; k++) { port = adapt->pPorts + k; snprintf(reason, sizeof(reason), "unauthorized " "use of Xv port %lu on adaptor '%s'", port->id, adapt->name); if ((client = port->grab.client) != NULL) { KillUnathorizedClient(client, AuthorizedClients, NumberOfClients, IdleClient, reason); } #if 0 if (port->client && port->client != client) { KillUnathorizedClient(port->client, AuthorizedClients, NumberOfClients, IdleClient, reason); } #endif } } } } } } }
static int ProcXvQueryAdaptors(ClientPtr client) { xvFormat format; xvAdaptorInfo ainfo; xvQueryAdaptorsReply rep; int totalSize, na, nf, rc; int nameSize; XvAdaptorPtr pa; XvFormatPtr pf; WindowPtr pWin; ScreenPtr pScreen; XvScreenPtr pxvs; REQUEST(xvQueryAdaptorsReq); REQUEST_SIZE_MATCH(xvQueryAdaptorsReq); rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); if (rc != Success) return rc; pScreen = pWin->drawable.pScreen; pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey()); if (!pxvs) { rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.num_adaptors = 0; rep.length = 0; _WriteQueryAdaptorsReply(client, &rep); return Success; } (* pxvs->ddQueryAdaptors)(pScreen, &pxvs->pAdaptors, &pxvs->nAdaptors); rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.num_adaptors = pxvs->nAdaptors; /* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */ totalSize = pxvs->nAdaptors * sz_xvAdaptorInfo; /* FOR EACH ADPATOR ADD UP THE BYTES FOR ENCODINGS AND FORMATS */ na = pxvs->nAdaptors; pa = pxvs->pAdaptors; while (na--) { totalSize += pad_to_int32(strlen(pa->name)); totalSize += pa->nFormats * sz_xvFormat; pa++; } rep.length = bytes_to_int32(totalSize); _WriteQueryAdaptorsReply(client, &rep); na = pxvs->nAdaptors; pa = pxvs->pAdaptors; while (na--) { ainfo.base_id = pa->base_id; ainfo.num_ports = pa->nPorts; ainfo.type = pa->type; ainfo.name_size = nameSize = strlen(pa->name); ainfo.num_formats = pa->nFormats; _WriteAdaptorInfo(client, &ainfo); WriteToClient(client, nameSize, pa->name); nf = pa->nFormats; pf = pa->pFormats; while (nf--) { format.depth = pf->depth; format.visual = pf->visual; _WriteFormat(client, &format); pf++; } pa++; } return Success; }
void XineramifyXv(void) { ScreenPtr pScreen, screen0 = screenInfo.screens[0]; XvScreenPtr xvsp0 = (XvScreenPtr)dixLookupPrivate(&screen0->devPrivates, XvGetScreenKey()); XvAdaptorPtr refAdapt, pAdapt; XvAttributePtr pAttr; XvScreenPtr xvsp; Bool isOverlay, hasOverlay; PanoramiXRes *port; XvAdaptorPtr MatchingAdaptors[MAXSCREENS]; int i, j, k, l; XvXRTPort = CreateNewResourceType(XineramaDeleteResource); if(!xvsp0) return; for(i = 0; i < xvsp0->nAdaptors; i++) { refAdapt = xvsp0->pAdaptors + i; bzero(MatchingAdaptors, sizeof(XvAdaptorPtr) * MAXSCREENS); MatchingAdaptors[0] = refAdapt; if(!(refAdapt->type & XvInputMask)) continue; isOverlay = FALSE; for(j = 0; j < refAdapt->nAttributes; j++) { pAttr = refAdapt->pAttributes + j; if(!strcmp(pAttr->name, "XV_COLORKEY")) { isOverlay = TRUE; break; } } for(j = 1; j < PanoramiXNumScreens; j++) { pScreen = screenInfo.screens[j]; xvsp = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey()); /* Do not try to go on if xv is not supported on this screen */ if (xvsp==NULL) continue ; /* if the adaptor has the same name it's a perfect match */ for(k = 0; k < xvsp->nAdaptors; k++) { pAdapt = xvsp->pAdaptors + k; if(!strcmp(refAdapt->name, pAdapt->name)) { MatchingAdaptors[j] = pAdapt; break; } } if(MatchingAdaptors[j]) continue; /* found it */ /* otherwise we only look for XvImage adaptors */ if(!(refAdapt->type & XvImageMask)) continue; if(refAdapt->nImages <= 0) continue; /* prefer overlay/overlay non-overlay/non-overlay pairing */ for(k = 0; k < xvsp->nAdaptors; k++) { pAdapt = xvsp->pAdaptors + k; if((pAdapt->type & XvImageMask) && (pAdapt->nImages > 0)) { hasOverlay = FALSE; for(l = 0; l < pAdapt->nAttributes; l++) { if(!strcmp(pAdapt->name, "XV_COLORKEY")) { hasOverlay = TRUE; break; } } if(isOverlay && hasOverlay) { MatchingAdaptors[j] = pAdapt; break; } else if(!isOverlay && !hasOverlay) { MatchingAdaptors[j] = pAdapt; break; } } } if(MatchingAdaptors[j]) continue; /* found it */ /* but we'll take any XvImage pairing if we can get it */ for(k = 0; k < xvsp->nAdaptors; k++) { pAdapt = xvsp->pAdaptors + k; if((pAdapt->type & XvImageMask) && (pAdapt->nImages > 0)) { MatchingAdaptors[j] = pAdapt; break; } } } /* now create a resource for each port */ for(j = 0; j < refAdapt->nPorts; j++) { if(!(port = xalloc(sizeof(PanoramiXRes)))) break; port->info[0].id = MatchingAdaptors[0]->base_id + j; AddResource(port->info[0].id, XvXRTPort, port); for(k = 1; k < PanoramiXNumScreens; k++) { if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j)) port->info[k].id = MatchingAdaptors[k]->base_id + j; else port->info[k].id = 0; } } } /* munge the dispatch vector */ XvProcVector[xv_PutVideo] = XineramaXvPutVideo; XvProcVector[xv_PutStill] = XineramaXvPutStill; XvProcVector[xv_StopVideo] = XineramaXvStopVideo; XvProcVector[xv_SetPortAttribute] = XineramaXvSetPortAttribute; XvProcVector[xv_PutImage] = XineramaXvPutImage; XvProcVector[xv_ShmPutImage] = XineramaXvShmPutImage; }