xvinfo.c revision 44af7230
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{
1444af7230Smrg   fprintf(stderr, "Usage:  xvinfo [-display host:dpy] [-short]\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;
3144af7230Smrg    char shortmode = 0;
328ae04fa6Smrg
3344af7230Smrg    if((argc > 4))
348ae04fa6Smrg       PrintUsage();
358ae04fa6Smrg
368ae04fa6Smrg    if(argc != 1) {
3744af7230Smrg       for ( i = 1; i < argc; i ++ ) {
3844af7230Smrg           if(! strcmp(argv[i], "-display")) {
3944af7230Smrg	       disname = argv[i + 1];
4044af7230Smrg	       i ++;
4144af7230Smrg	   } else if(! strcmp(argv[i], "-short") )
4244af7230Smrg	       shortmode = 1;
4344af7230Smrg	     else {
4444af7230Smrg	       PrintUsage();
4544af7230Smrg	     }
4644af7230Smrg       }
478ae04fa6Smrg    }
488ae04fa6Smrg
498ae04fa6Smrg
508ae04fa6Smrg    if(!(dpy = XOpenDisplay(disname)))
518ae04fa6Smrg    {
528ae04fa6Smrg	fprintf(stderr, "xvinfo:  Unable to open display %s\n",
538ae04fa6Smrg                       (disname != NULL) ? disname : XDisplayName(NULL));
548ae04fa6Smrg	exit(-1);
558ae04fa6Smrg    }
568ae04fa6Smrg
578ae04fa6Smrg    if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB)))
588ae04fa6Smrg    {
598ae04fa6Smrg	fprintf(stderr, "xvinfo: No X-Video Extension on %s\n",
608ae04fa6Smrg                        (disname != NULL) ? disname : XDisplayName(NULL));
618ae04fa6Smrg	exit(0);
628ae04fa6Smrg    }
638ae04fa6Smrg    else
648ae04fa6Smrg    {
658ae04fa6Smrg	fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev);
668ae04fa6Smrg    }
678ae04fa6Smrg
688ae04fa6Smrg    nscreens = ScreenCount(dpy);
698ae04fa6Smrg
708ae04fa6Smrg    for(i = 0; i < nscreens; i++) {
718ae04fa6Smrg  	fprintf(stdout, "screen #%i\n", i);
728ae04fa6Smrg	XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo);
738ae04fa6Smrg
748ae04fa6Smrg	if(!nadaptors) {
758ae04fa6Smrg	    fprintf(stdout, " no adaptors present\n");
768ae04fa6Smrg	    continue;
778ae04fa6Smrg	}
788ae04fa6Smrg
798ae04fa6Smrg	for(j = 0; j < nadaptors; j++) {
808ae04fa6Smrg	    fprintf(stdout, "  Adaptor #%i: \"%s\"\n", j, ainfo[j].name);
818ae04fa6Smrg	    fprintf(stdout, "    number of ports: %li\n", ainfo[j].num_ports);
828ae04fa6Smrg	    fprintf(stdout, "    port base: %li\n", ainfo[j].base_id);
838ae04fa6Smrg	    fprintf(stdout, "    operations supported: ");
848ae04fa6Smrg	    switch(ainfo[j].type & (XvInputMask | XvOutputMask)) {
858ae04fa6Smrg	    case XvInputMask:
868ae04fa6Smrg	     if(ainfo[j].type & XvVideoMask)
878ae04fa6Smrg		fprintf(stdout, "PutVideo ");
888ae04fa6Smrg	     if(ainfo[j].type & XvStillMask)
898ae04fa6Smrg		fprintf(stdout, "PutStill ");
908ae04fa6Smrg	     if(ainfo[j].type & XvImageMask)
918ae04fa6Smrg		fprintf(stdout, "PutImage ");
928ae04fa6Smrg	     break;
938ae04fa6Smrg	    case XvOutputMask:
948ae04fa6Smrg	     if(ainfo[j].type & XvVideoMask)
958ae04fa6Smrg		fprintf(stdout, "GetVideo ");
968ae04fa6Smrg	     if(ainfo[j].type & XvStillMask)
978ae04fa6Smrg		fprintf(stdout, "GetStill ");
988ae04fa6Smrg	     break;
998ae04fa6Smrg	    default:
1008ae04fa6Smrg		fprintf(stdout, "none ");
1018ae04fa6Smrg		break;
1028ae04fa6Smrg	    }
1038ae04fa6Smrg	    fprintf(stdout, "\n");
1048ae04fa6Smrg
1058ae04fa6Smrg	    format = ainfo[j].formats;
1068ae04fa6Smrg
10744af7230Smrg	    if ( ! shortmode ) {
10844af7230Smrg		    fprintf(stdout, "    supported visuals:\n");
10944af7230Smrg		    for(k = 0; k < ainfo[j].num_formats; k++, format++) {
11044af7230Smrg		         fprintf(stdout, "      depth %i, visualID 0x%2lx\n",
1118ae04fa6Smrg				 format->depth, format->visual_id);
11244af7230Smrg		    }
1138ae04fa6Smrg	    }
1148ae04fa6Smrg
1158ae04fa6Smrg	    attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr);
1168ae04fa6Smrg
1178ae04fa6Smrg	    if(attributes && nattr) {
1188ae04fa6Smrg		fprintf(stdout, "    number of attributes: %i\n", nattr);
1198ae04fa6Smrg
1208ae04fa6Smrg		for(k = 0; k < nattr; k++) {
1218ae04fa6Smrg		    fprintf(stdout, "      \"%s\" (range %i to %i)\n",
1228ae04fa6Smrg					attributes[k].name,
1238ae04fa6Smrg					attributes[k].min_value,
1248ae04fa6Smrg					attributes[k].max_value);
1258ae04fa6Smrg
1268ae04fa6Smrg		    if(attributes[k].flags & XvSettable)
12744af7230Smrg			if ( ! shortmode )
12844af7230Smrg		    	  fprintf(stdout, "              client settable attribute\n");
12944af7230Smrg		        else fprintf(stdout, "              settable");
1308ae04fa6Smrg
1318ae04fa6Smrg		    if(attributes[k].flags & XvGettable) {
1328ae04fa6Smrg			Atom the_atom;
1338ae04fa6Smrg			int value;
13444af7230Smrg
13544af7230Smrg			if ( ! shortmode )
13644af7230Smrg		    	  fprintf(stdout, "              client gettable attribute");
13744af7230Smrg			else fprintf(stdout, ", gettable");
1388ae04fa6Smrg
1398ae04fa6Smrg			the_atom = XInternAtom(dpy, attributes[k].name, True);
1408ae04fa6Smrg
1418ae04fa6Smrg			if(the_atom != None){
1428ae04fa6Smrg			   if((Success == XvGetPortAttribute(dpy,
1438ae04fa6Smrg					ainfo[j].base_id, the_atom, &value)))
1448ae04fa6Smrg		    	       fprintf(stdout, " (current value is %i)", value);
1458ae04fa6Smrg			}
14644af7230Smrg			fprintf(stdout, "\n");
1478ae04fa6Smrg		    }
14844af7230Smrg		    else if (shortmode)
14944af7230Smrg			fprintf(stdout, "\n");
1508ae04fa6Smrg
1518ae04fa6Smrg		}
1528ae04fa6Smrg		XFree(attributes);
1538ae04fa6Smrg	    } else {
1548ae04fa6Smrg		fprintf(stdout, "    no port attributes defined\n");
1558ae04fa6Smrg	    }
1568ae04fa6Smrg
1578ae04fa6Smrg	    XvQueryEncodings(dpy, ainfo[j].base_id,
1588ae04fa6Smrg						&nencode, &encodings);
1598ae04fa6Smrg
1608ae04fa6Smrg	    if(encodings && nencode) {
1618ae04fa6Smrg		int ImageEncodings = 0;
1628ae04fa6Smrg
1638ae04fa6Smrg		for(n = 0; n < nencode; n++) {
1648ae04fa6Smrg		    if(!strcmp(encodings[n].name, "XV_IMAGE"))
1658ae04fa6Smrg			ImageEncodings++;
1668ae04fa6Smrg		}
1678ae04fa6Smrg
1688ae04fa6Smrg		if(nencode - ImageEncodings) {
1698ae04fa6Smrg		    fprintf(stdout, "    number of encodings: %i\n",
1708ae04fa6Smrg						nencode - ImageEncodings);
1718ae04fa6Smrg
1728ae04fa6Smrg		    for(n = 0; n < nencode; n++) {
1738ae04fa6Smrg		    	if(strcmp(encodings[n].name, "XV_IMAGE")) {
1748ae04fa6Smrg			    fprintf(stdout, "      encoding ID #%li: \"%s\"\n",
1758ae04fa6Smrg					encodings[n].encoding_id,
1768ae04fa6Smrg					encodings[n].name);
1778ae04fa6Smrg			    fprintf(stdout, "        size: %li x %li\n",
1788ae04fa6Smrg					encodings[n].width,
1798ae04fa6Smrg					encodings[n].height);
1808ae04fa6Smrg			    fprintf(stdout, "        rate: %f\n",
1818ae04fa6Smrg					(float)encodings[n].rate.numerator/
1828ae04fa6Smrg					(float)encodings[n].rate.denominator);
1838ae04fa6Smrg			}
1848ae04fa6Smrg		    }
1858ae04fa6Smrg		}
1868ae04fa6Smrg
1878ae04fa6Smrg		if(ImageEncodings && (ainfo[j].type & XvImageMask)) {
1888ae04fa6Smrg		   char imageName[5];
1898ae04fa6Smrg
1908ae04fa6Smrg		   for(n = 0; n < nencode; n++) {
1918ae04fa6Smrg		      if(!strcmp(encodings[n].name, "XV_IMAGE")) {
1928ae04fa6Smrg			fprintf(stdout,
1938ae04fa6Smrg				"    maximum XvImage size: %li x %li\n",
1948ae04fa6Smrg				encodings[n].width, encodings[n].height);
1958ae04fa6Smrg			break;
1968ae04fa6Smrg		      }
1978ae04fa6Smrg		   }
1988ae04fa6Smrg
1998ae04fa6Smrg                   formats = XvListImageFormats(
2008ae04fa6Smrg				dpy, ainfo[j].base_id, &numImages);
2018ae04fa6Smrg
2028ae04fa6Smrg		   fprintf(stdout, "    Number of image formats: %i\n",
2038ae04fa6Smrg						numImages);
2048ae04fa6Smrg
2058ae04fa6Smrg		   for(n = 0; n < numImages; n++) {
2068ae04fa6Smrg			sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff,
2078ae04fa6Smrg				(formats[n].id >> 8) & 0xff,
2088ae04fa6Smrg				(formats[n].id >> 16) & 0xff,
2098ae04fa6Smrg				(formats[n].id >> 24) & 0xff);
2108ae04fa6Smrg			fprintf(stdout, "      id: 0x%x", formats[n].id);
2118ae04fa6Smrg			if(isprint(imageName[0]) && isprint(imageName[1]) &&
2128ae04fa6Smrg			  isprint(imageName[2]) && isprint(imageName[3]))
2138ae04fa6Smrg			{
2148ae04fa6Smrg			  fprintf(stdout, " (%s)\n", imageName);
2158ae04fa6Smrg			} else {
2168ae04fa6Smrg			  fprintf(stdout, "\n");
2178ae04fa6Smrg			}
21844af7230Smrg			if ( ! shortmode ) {
21944af7230Smrg			    fprintf(stdout, "        guid: ");
22044af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2218ae04fa6Smrg						formats[n].guid[0]);
22244af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2238ae04fa6Smrg						formats[n].guid[1]);
22444af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2258ae04fa6Smrg						formats[n].guid[2]);
22644af7230Smrg			    fprintf(stdout, "%02x-", (unsigned char)
2278ae04fa6Smrg						formats[n].guid[3]);
22844af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2298ae04fa6Smrg						formats[n].guid[4]);
23044af7230Smrg			    fprintf(stdout, "%02x-", (unsigned char)
2318ae04fa6Smrg						formats[n].guid[5]);
23244af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2338ae04fa6Smrg						formats[n].guid[6]);
23444af7230Smrg			    fprintf(stdout, "%02x-", (unsigned char)
2358ae04fa6Smrg						formats[n].guid[7]);
23644af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2378ae04fa6Smrg						formats[n].guid[8]);
23844af7230Smrg			    fprintf(stdout, "%02x-", (unsigned char)
2398ae04fa6Smrg						formats[n].guid[9]);
24044af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2418ae04fa6Smrg						formats[n].guid[10]);
24244af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2438ae04fa6Smrg						formats[n].guid[11]);
24444af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2458ae04fa6Smrg						formats[n].guid[12]);
24644af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2478ae04fa6Smrg						formats[n].guid[13]);
24844af7230Smrg			    fprintf(stdout, "%02x", (unsigned char)
2498ae04fa6Smrg						formats[n].guid[14]);
25044af7230Smrg			    fprintf(stdout, "%02x\n", (unsigned char)
2518ae04fa6Smrg						formats[n].guid[15]);
2528ae04fa6Smrg
25344af7230Smrg			    fprintf(stdout, "        bits per pixel: %i\n",
2548ae04fa6Smrg					formats[n].bits_per_pixel);
25544af7230Smrg			    fprintf(stdout, "        number of planes: %i\n",
2568ae04fa6Smrg					formats[n].num_planes);
25744af7230Smrg			    fprintf(stdout, "        type: %s (%s)\n",
25844af7230Smrg			      (formats[n].type == XvRGB) ? "RGB" : "YUV",
25944af7230Smrg			      (formats[n].format == XvPacked) ? "packed" : "planar");
2608ae04fa6Smrg
26144af7230Smrg			    if(formats[n].type == XvRGB) {
26244af7230Smrg			        fprintf(stdout, "        depth: %i\n",
2638ae04fa6Smrg                                        formats[n].depth);
2648ae04fa6Smrg
26544af7230Smrg			        fprintf(stdout, "        red, green, blue masks: "
2668ae04fa6Smrg					"0x%x, 0x%x, 0x%x\n",
2678ae04fa6Smrg					formats[n].red_mask,
2688ae04fa6Smrg					formats[n].green_mask,
2698ae04fa6Smrg					formats[n].blue_mask);
27044af7230Smrg			    } else {
2718ae04fa6Smrg
27244af7230Smrg			    }
2738ae04fa6Smrg			}
2748ae04fa6Smrg
2758ae04fa6Smrg
2768ae04fa6Smrg		   }
2778ae04fa6Smrg		   if(formats) XFree(formats);
2788ae04fa6Smrg		}
2798ae04fa6Smrg
2808ae04fa6Smrg		XvFreeEncodingInfo(encodings);
2818ae04fa6Smrg	    }
2828ae04fa6Smrg
2838ae04fa6Smrg	}
2848ae04fa6Smrg
2858ae04fa6Smrg	XvFreeAdaptorInfo(ainfo);
2868ae04fa6Smrg    }
2878ae04fa6Smrg    return 1;
2888ae04fa6Smrg}
289