コード例 #1
0
ファイル: xvdisp.c プロジェクト: eriytt/xserver-xsdl
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;
}
コード例 #2
0
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");
            } 
        }
    }
}
コード例 #3
0
ファイル: xvdisp.c プロジェクト: eriytt/xserver-xsdl
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;
}
コード例 #4
0
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
                        }
                    }
                }
            }
        }
    }
}
コード例 #5
0
ファイル: xvdisp.c プロジェクト: eriytt/xserver-xsdl
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;
}
コード例 #6
0
ファイル: xvdisp.c プロジェクト: aosm/X11server
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;
}