xvinfo.c revision 8ae04fa6
18ae04fa6Smrg/* $XFree86: xc/programs/xvinfo/xvinfo.c,v 1.7 2001/10/28 03:34:43 tsi Exp $ */
28ae04fa6Smrg
38ae04fa6Smrg#include <X11/X.h>
48ae04fa6Smrg#include <X11/Xlib.h>
58ae04fa6Smrg#include <X11/extensions/Xvlib.h>
68ae04fa6Smrg#include <stdio.h>
78ae04fa6Smrg#include <stdlib.h>
88ae04fa6Smrg#include <string.h>
98ae04fa6Smrg#include <ctype.h>
108ae04fa6Smrg
118ae04fa6Smrgstatic void
128ae04fa6SmrgPrintUsage(void)
138ae04fa6Smrg{
148ae04fa6Smrg   fprintf(stderr, "Usage:  xvinfo [-display host:dpy]\n");
158ae04fa6Smrg   exit(0);
168ae04fa6Smrg}
178ae04fa6Smrg
188ae04fa6Smrgint main(int argc, char *argv[])
198ae04fa6Smrg{
208ae04fa6Smrg    Display *dpy;
218ae04fa6Smrg    unsigned int ver, rev, eventB, reqB, errorB;
228ae04fa6Smrg    int i, j, k, n;
238ae04fa6Smrg    unsigned int nencode, nadaptors;
248ae04fa6Smrg    int nscreens, nattr, numImages;
258ae04fa6Smrg    XvAdaptorInfo *ainfo;
268ae04fa6Smrg    XvAttribute *attributes;
278ae04fa6Smrg    XvEncodingInfo *encodings;
288ae04fa6Smrg    XvFormat *format;
298ae04fa6Smrg    XvImageFormatValues *formats;
308ae04fa6Smrg    char * disname = NULL;
318ae04fa6Smrg
328ae04fa6Smrg    if((argc != 1) && (argc != 3))
338ae04fa6Smrg       PrintUsage();
348ae04fa6Smrg
358ae04fa6Smrg    if(argc != 1) {
368ae04fa6Smrg       if(strcmp(argv[1], "-display"))
378ae04fa6Smrg	  PrintUsage();
388ae04fa6Smrg	disname = argv[2];
398ae04fa6Smrg    }
408ae04fa6Smrg
418ae04fa6Smrg
428ae04fa6Smrg    if(!(dpy = XOpenDisplay(disname)))
438ae04fa6Smrg    {
448ae04fa6Smrg	fprintf(stderr, "xvinfo:  Unable to open display %s\n",
458ae04fa6Smrg                       (disname != NULL) ? disname : XDisplayName(NULL));
468ae04fa6Smrg	exit(-1);
478ae04fa6Smrg    }
488ae04fa6Smrg
498ae04fa6Smrg    if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB)))
508ae04fa6Smrg    {
518ae04fa6Smrg	fprintf(stderr, "xvinfo: No X-Video Extension on %s\n",
528ae04fa6Smrg                        (disname != NULL) ? disname : XDisplayName(NULL));
538ae04fa6Smrg	exit(0);
548ae04fa6Smrg    }
558ae04fa6Smrg    else
568ae04fa6Smrg    {
578ae04fa6Smrg	fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev);
588ae04fa6Smrg    }
598ae04fa6Smrg
608ae04fa6Smrg    nscreens = ScreenCount(dpy);
618ae04fa6Smrg
628ae04fa6Smrg    for(i = 0; i < nscreens; i++) {
638ae04fa6Smrg  	fprintf(stdout, "screen #%i\n", i);
648ae04fa6Smrg	XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo);
658ae04fa6Smrg
668ae04fa6Smrg	if(!nadaptors) {
678ae04fa6Smrg	    fprintf(stdout, " no adaptors present\n");
688ae04fa6Smrg	    continue;
698ae04fa6Smrg	}
708ae04fa6Smrg
718ae04fa6Smrg	for(j = 0; j < nadaptors; j++) {
728ae04fa6Smrg	    fprintf(stdout, "  Adaptor #%i: \"%s\"\n", j, ainfo[j].name);
738ae04fa6Smrg	    fprintf(stdout, "    number of ports: %li\n", ainfo[j].num_ports);
748ae04fa6Smrg	    fprintf(stdout, "    port base: %li\n", ainfo[j].base_id);
758ae04fa6Smrg	    fprintf(stdout, "    operations supported: ");
768ae04fa6Smrg	    switch(ainfo[j].type & (XvInputMask | XvOutputMask)) {
778ae04fa6Smrg	    case XvInputMask:
788ae04fa6Smrg	     if(ainfo[j].type & XvVideoMask)
798ae04fa6Smrg		fprintf(stdout, "PutVideo ");
808ae04fa6Smrg	     if(ainfo[j].type & XvStillMask)
818ae04fa6Smrg		fprintf(stdout, "PutStill ");
828ae04fa6Smrg	     if(ainfo[j].type & XvImageMask)
838ae04fa6Smrg		fprintf(stdout, "PutImage ");
848ae04fa6Smrg	     break;
858ae04fa6Smrg	    case XvOutputMask:
868ae04fa6Smrg	     if(ainfo[j].type & XvVideoMask)
878ae04fa6Smrg		fprintf(stdout, "GetVideo ");
888ae04fa6Smrg	     if(ainfo[j].type & XvStillMask)
898ae04fa6Smrg		fprintf(stdout, "GetStill ");
908ae04fa6Smrg	     break;
918ae04fa6Smrg	    default:
928ae04fa6Smrg		fprintf(stdout, "none ");
938ae04fa6Smrg		break;
948ae04fa6Smrg	    }
958ae04fa6Smrg	    fprintf(stdout, "\n");
968ae04fa6Smrg
978ae04fa6Smrg	    format = ainfo[j].formats;
988ae04fa6Smrg
998ae04fa6Smrg	    fprintf(stdout, "    supported visuals:\n");
1008ae04fa6Smrg	    for(k = 0; k < ainfo[j].num_formats; k++, format++) {
1018ae04fa6Smrg	         fprintf(stdout, "      depth %i, visualID 0x%2lx\n",
1028ae04fa6Smrg				 format->depth, format->visual_id);
1038ae04fa6Smrg	    }
1048ae04fa6Smrg
1058ae04fa6Smrg	    attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr);
1068ae04fa6Smrg
1078ae04fa6Smrg	    if(attributes && nattr) {
1088ae04fa6Smrg		fprintf(stdout, "    number of attributes: %i\n", nattr);
1098ae04fa6Smrg
1108ae04fa6Smrg		for(k = 0; k < nattr; k++) {
1118ae04fa6Smrg		    fprintf(stdout, "      \"%s\" (range %i to %i)\n",
1128ae04fa6Smrg					attributes[k].name,
1138ae04fa6Smrg					attributes[k].min_value,
1148ae04fa6Smrg					attributes[k].max_value);
1158ae04fa6Smrg
1168ae04fa6Smrg		    if(attributes[k].flags & XvSettable)
1178ae04fa6Smrg		    	fprintf(stdout, "              client settable attribute\n");
1188ae04fa6Smrg
1198ae04fa6Smrg		    if(attributes[k].flags & XvGettable) {
1208ae04fa6Smrg			Atom the_atom;
1218ae04fa6Smrg			int value;
1228ae04fa6Smrg
1238ae04fa6Smrg		    	fprintf(stdout, "              client gettable attribute");
1248ae04fa6Smrg			the_atom = XInternAtom(dpy, attributes[k].name, True);
1258ae04fa6Smrg
1268ae04fa6Smrg			if(the_atom != None){
1278ae04fa6Smrg			   if((Success == XvGetPortAttribute(dpy,
1288ae04fa6Smrg					ainfo[j].base_id, the_atom, &value)))
1298ae04fa6Smrg		    	       fprintf(stdout, " (current value is %i)", value);
1308ae04fa6Smrg			}
1318ae04fa6Smrg		        fprintf(stdout, "\n");
1328ae04fa6Smrg		    }
1338ae04fa6Smrg
1348ae04fa6Smrg		}
1358ae04fa6Smrg		XFree(attributes);
1368ae04fa6Smrg	    } else {
1378ae04fa6Smrg		fprintf(stdout, "    no port attributes defined\n");
1388ae04fa6Smrg	    }
1398ae04fa6Smrg
1408ae04fa6Smrg	    XvQueryEncodings(dpy, ainfo[j].base_id,
1418ae04fa6Smrg						&nencode, &encodings);
1428ae04fa6Smrg
1438ae04fa6Smrg	    if(encodings && nencode) {
1448ae04fa6Smrg		int ImageEncodings = 0;
1458ae04fa6Smrg
1468ae04fa6Smrg		for(n = 0; n < nencode; n++) {
1478ae04fa6Smrg		    if(!strcmp(encodings[n].name, "XV_IMAGE"))
1488ae04fa6Smrg			ImageEncodings++;
1498ae04fa6Smrg		}
1508ae04fa6Smrg
1518ae04fa6Smrg		if(nencode - ImageEncodings) {
1528ae04fa6Smrg		    fprintf(stdout, "    number of encodings: %i\n",
1538ae04fa6Smrg						nencode - ImageEncodings);
1548ae04fa6Smrg
1558ae04fa6Smrg		    for(n = 0; n < nencode; n++) {
1568ae04fa6Smrg		    	if(strcmp(encodings[n].name, "XV_IMAGE")) {
1578ae04fa6Smrg			    fprintf(stdout, "      encoding ID #%li: \"%s\"\n",
1588ae04fa6Smrg					encodings[n].encoding_id,
1598ae04fa6Smrg					encodings[n].name);
1608ae04fa6Smrg			    fprintf(stdout, "        size: %li x %li\n",
1618ae04fa6Smrg					encodings[n].width,
1628ae04fa6Smrg					encodings[n].height);
1638ae04fa6Smrg			    fprintf(stdout, "        rate: %f\n",
1648ae04fa6Smrg					(float)encodings[n].rate.numerator/
1658ae04fa6Smrg					(float)encodings[n].rate.denominator);
1668ae04fa6Smrg			}
1678ae04fa6Smrg		    }
1688ae04fa6Smrg		}
1698ae04fa6Smrg
1708ae04fa6Smrg		if(ImageEncodings && (ainfo[j].type & XvImageMask)) {
1718ae04fa6Smrg		   char imageName[5];
1728ae04fa6Smrg
1738ae04fa6Smrg		   for(n = 0; n < nencode; n++) {
1748ae04fa6Smrg		      if(!strcmp(encodings[n].name, "XV_IMAGE")) {
1758ae04fa6Smrg			fprintf(stdout,
1768ae04fa6Smrg				"    maximum XvImage size: %li x %li\n",
1778ae04fa6Smrg				encodings[n].width, encodings[n].height);
1788ae04fa6Smrg			break;
1798ae04fa6Smrg		      }
1808ae04fa6Smrg		   }
1818ae04fa6Smrg
1828ae04fa6Smrg                   formats = XvListImageFormats(
1838ae04fa6Smrg				dpy, ainfo[j].base_id, &numImages);
1848ae04fa6Smrg
1858ae04fa6Smrg		   fprintf(stdout, "    Number of image formats: %i\n",
1868ae04fa6Smrg						numImages);
1878ae04fa6Smrg
1888ae04fa6Smrg		   for(n = 0; n < numImages; n++) {
1898ae04fa6Smrg			sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff,
1908ae04fa6Smrg				(formats[n].id >> 8) & 0xff,
1918ae04fa6Smrg				(formats[n].id >> 16) & 0xff,
1928ae04fa6Smrg				(formats[n].id >> 24) & 0xff);
1938ae04fa6Smrg			fprintf(stdout, "      id: 0x%x", formats[n].id);
1948ae04fa6Smrg			if(isprint(imageName[0]) && isprint(imageName[1]) &&
1958ae04fa6Smrg			  isprint(imageName[2]) && isprint(imageName[3]))
1968ae04fa6Smrg			{
1978ae04fa6Smrg			  fprintf(stdout, " (%s)\n", imageName);
1988ae04fa6Smrg			} else {
1998ae04fa6Smrg			  fprintf(stdout, "\n");
2008ae04fa6Smrg			}
2018ae04fa6Smrg			fprintf(stdout, "        guid: ");
2028ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2038ae04fa6Smrg						formats[n].guid[0]);
2048ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2058ae04fa6Smrg						formats[n].guid[1]);
2068ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2078ae04fa6Smrg						formats[n].guid[2]);
2088ae04fa6Smrg			fprintf(stdout, "%02x-", (unsigned char)
2098ae04fa6Smrg						formats[n].guid[3]);
2108ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2118ae04fa6Smrg						formats[n].guid[4]);
2128ae04fa6Smrg			fprintf(stdout, "%02x-", (unsigned char)
2138ae04fa6Smrg						formats[n].guid[5]);
2148ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2158ae04fa6Smrg						formats[n].guid[6]);
2168ae04fa6Smrg			fprintf(stdout, "%02x-", (unsigned char)
2178ae04fa6Smrg						formats[n].guid[7]);
2188ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2198ae04fa6Smrg						formats[n].guid[8]);
2208ae04fa6Smrg			fprintf(stdout, "%02x-", (unsigned char)
2218ae04fa6Smrg						formats[n].guid[9]);
2228ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2238ae04fa6Smrg						formats[n].guid[10]);
2248ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2258ae04fa6Smrg						formats[n].guid[11]);
2268ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2278ae04fa6Smrg						formats[n].guid[12]);
2288ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2298ae04fa6Smrg						formats[n].guid[13]);
2308ae04fa6Smrg			fprintf(stdout, "%02x", (unsigned char)
2318ae04fa6Smrg						formats[n].guid[14]);
2328ae04fa6Smrg			fprintf(stdout, "%02x\n", (unsigned char)
2338ae04fa6Smrg						formats[n].guid[15]);
2348ae04fa6Smrg
2358ae04fa6Smrg			fprintf(stdout, "        bits per pixel: %i\n",
2368ae04fa6Smrg					formats[n].bits_per_pixel);
2378ae04fa6Smrg			fprintf(stdout, "        number of planes: %i\n",
2388ae04fa6Smrg					formats[n].num_planes);
2398ae04fa6Smrg			fprintf(stdout, "        type: %s (%s)\n",
2408ae04fa6Smrg			 (formats[n].type == XvRGB) ? "RGB" : "YUV",
2418ae04fa6Smrg			 (formats[n].format == XvPacked) ? "packed" : "planar");
2428ae04fa6Smrg
2438ae04fa6Smrg			if(formats[n].type == XvRGB) {
2448ae04fa6Smrg			    fprintf(stdout, "        depth: %i\n",
2458ae04fa6Smrg                                        formats[n].depth);
2468ae04fa6Smrg
2478ae04fa6Smrg			    fprintf(stdout, "        red, green, blue masks: "
2488ae04fa6Smrg					"0x%x, 0x%x, 0x%x\n",
2498ae04fa6Smrg					formats[n].red_mask,
2508ae04fa6Smrg					formats[n].green_mask,
2518ae04fa6Smrg					formats[n].blue_mask);
2528ae04fa6Smrg			} else {
2538ae04fa6Smrg
2548ae04fa6Smrg			}
2558ae04fa6Smrg
2568ae04fa6Smrg
2578ae04fa6Smrg		   }
2588ae04fa6Smrg		   if(formats) XFree(formats);
2598ae04fa6Smrg		}
2608ae04fa6Smrg
2618ae04fa6Smrg		XvFreeEncodingInfo(encodings);
2628ae04fa6Smrg	    }
2638ae04fa6Smrg
2648ae04fa6Smrg	}
2658ae04fa6Smrg
2668ae04fa6Smrg	XvFreeAdaptorInfo(ainfo);
2678ae04fa6Smrg    }
2688ae04fa6Smrg    return 1;
2698ae04fa6Smrg}
270