summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xvinfo.c266
-rw-r--r--xvinfo.man29
2 files changed, 295 insertions, 0 deletions
diff --git a/xvinfo.c b/xvinfo.c
new file mode 100644
index 0000000..77e9eff
--- /dev/null
+++ b/xvinfo.c
@@ -0,0 +1,266 @@
+/* $XFree86: xc/programs/xvinfo/xvinfo.c,v 1.8 2002/01/22 23:05:43 mvojkovi Exp $ */
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/Xvlib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+static void
+PrintUsage(void)
+{
+ fprintf(stderr, "Usage: xvinfo [-display host:dpy]\n");
+ exit(0);
+}
+
+int main(int argc, char *argv[])
+{
+ Display *dpy;
+ unsigned int ver, rev, eventB, reqB, errorB;
+ int i, j, k, n;
+ unsigned int nencode, nadaptors;
+ int nscreens, nattr, numImages;
+ XvAdaptorInfo *ainfo;
+ XvAttribute *attributes;
+ XvEncodingInfo *encodings;
+ XvFormat *format;
+ XvImageFormatValues *formats;
+ char * disname = NULL;
+
+ if((argc != 1) && (argc != 3))
+ PrintUsage();
+
+ if(argc != 1) {
+ if(strcmp(argv[1], "-display"))
+ PrintUsage();
+ disname = argv[2];
+ }
+
+
+ if(!(dpy = XOpenDisplay(disname)))
+ {
+ fprintf(stderr, "xvinfo: Unable to open display %s\n",
+ (disname != NULL) ? disname : XDisplayName(NULL));
+ exit(-1);
+ }
+
+ if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB)))
+ {
+ fprintf(stderr, "xvinfo: No X-Video Extension on %s\n",
+ (disname != NULL) ? disname : XDisplayName(NULL));
+ exit(0);
+ }
+ else
+ {
+ fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev);
+ }
+
+ nscreens = ScreenCount(dpy);
+
+ for(i = 0; i < nscreens; i++) {
+ fprintf(stdout, "screen #%i\n", i);
+ XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo);
+
+ if(!nadaptors) {
+ fprintf(stdout, " no adaptors present\n");
+ continue;
+ }
+
+ for(j = 0; j < nadaptors; j++) {
+ fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name);
+ fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports);
+ fprintf(stdout, " port base: %li\n", ainfo[j].base_id);
+ fprintf(stdout, " operations supported: ");
+ switch(ainfo[j].type & (XvInputMask | XvOutputMask)) {
+ case XvInputMask:
+ if(ainfo[j].type & XvVideoMask)
+ fprintf(stdout, "PutVideo ");
+ if(ainfo[j].type & XvStillMask)
+ fprintf(stdout, "PutStill ");
+ if(ainfo[j].type & XvImageMask)
+ fprintf(stdout, "PutImage ");
+ break;
+ case XvOutputMask:
+ if(ainfo[j].type & XvVideoMask)
+ fprintf(stdout, "GetVideo ");
+ if(ainfo[j].type & XvStillMask)
+ fprintf(stdout, "GetStill ");
+ break;
+ default:
+ fprintf(stdout, "none ");
+ break;
+ }
+ fprintf(stdout, "\n");
+
+ format = ainfo[j].formats;
+
+ fprintf(stdout, " supported visuals:\n");
+ for(k = 0; k < ainfo[j].num_formats; k++, format++) {
+ fprintf(stdout, " depth %i, visualID 0x%2lx\n",
+ format->depth, format->visual_id);
+ }
+
+ attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr);
+
+ if(attributes && nattr) {
+ fprintf(stdout, " number of attributes: %i\n", nattr);
+
+ for(k = 0; k < nattr; k++) {
+ fprintf(stdout, " \"%s\" (range %i to %i)\n",
+ attributes[k].name,
+ attributes[k].min_value,
+ attributes[k].max_value);
+
+ if(attributes[k].flags & XvSettable)
+ fprintf(stdout, " client settable attribute\n");
+
+ if(attributes[k].flags & XvGettable) {
+ Atom the_atom;
+ int value;
+
+ fprintf(stdout, " client gettable attribute");
+ the_atom = XInternAtom(dpy, attributes[k].name, True);
+
+ if(the_atom != None){
+ if((Success == XvGetPortAttribute(dpy,
+ ainfo[j].base_id, the_atom, &value)))
+ fprintf(stdout, " (current value is %i)", value);
+ }
+ fprintf(stdout, "\n");
+ }
+
+ }
+ XFree(attributes);
+ } else {
+ fprintf(stdout, " no port attributes defined\n");
+ }
+
+ XvQueryEncodings(dpy, ainfo[j].base_id,
+ &nencode, &encodings);
+
+ if(encodings && nencode) {
+ int ImageEncodings = 0;
+
+ for(n = 0; n < nencode; n++) {
+ if(!strcmp(encodings[n].name, "XV_IMAGE"))
+ ImageEncodings++;
+ }
+
+ if(nencode - ImageEncodings) {
+ fprintf(stdout, " number of encodings: %i\n",
+ nencode - ImageEncodings);
+
+ for(n = 0; n < nencode; n++) {
+ if(strcmp(encodings[n].name, "XV_IMAGE")) {
+ fprintf(stdout, " encoding ID #%li: \"%s\"\n",
+ encodings[n].encoding_id,
+ encodings[n].name);
+ fprintf(stdout, " size: %li x %li\n",
+ encodings[n].width,
+ encodings[n].height);
+ fprintf(stdout, " rate: %f\n",
+ (float)encodings[n].rate.numerator/
+ (float)encodings[n].rate.denominator);
+ }
+ }
+ }
+
+ if(ImageEncodings && (ainfo[j].type & XvImageMask)) {
+ char imageName[5] = {0, 0, 0, 0, 0};
+
+ for(n = 0; n < nencode; n++) {
+ if(!strcmp(encodings[n].name, "XV_IMAGE")) {
+ fprintf(stdout,
+ " maximum XvImage size: %li x %li\n",
+ encodings[n].width, encodings[n].height);
+ break;
+ }
+ }
+
+ formats = XvListImageFormats(
+ dpy, ainfo[j].base_id, &numImages);
+
+ fprintf(stdout, " Number of image formats: %i\n",
+ numImages);
+
+ for(n = 0; n < numImages; n++) {
+ memcpy(imageName, &(formats[n].id), 4);
+ fprintf(stdout, " id: 0x%x", formats[n].id);
+ if(isprint(imageName[0]) && isprint(imageName[1]) &&
+ isprint(imageName[2]) && isprint(imageName[3]))
+ {
+ fprintf(stdout, " (%s)\n", imageName);
+ } else {
+ fprintf(stdout, "\n");
+ }
+ fprintf(stdout, " guid: ");
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[0]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[1]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[2]);
+ fprintf(stdout, "%02x-", (unsigned char)
+ formats[n].guid[3]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[4]);
+ fprintf(stdout, "%02x-", (unsigned char)
+ formats[n].guid[5]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[6]);
+ fprintf(stdout, "%02x-", (unsigned char)
+ formats[n].guid[7]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[8]);
+ fprintf(stdout, "%02x-", (unsigned char)
+ formats[n].guid[9]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[10]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[11]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[12]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[13]);
+ fprintf(stdout, "%02x", (unsigned char)
+ formats[n].guid[14]);
+ fprintf(stdout, "%02x\n", (unsigned char)
+ formats[n].guid[15]);
+
+ fprintf(stdout, " bits per pixel: %i\n",
+ formats[n].bits_per_pixel);
+ fprintf(stdout, " number of planes: %i\n",
+ formats[n].num_planes);
+ fprintf(stdout, " type: %s (%s)\n",
+ (formats[n].type == XvRGB) ? "RGB" : "YUV",
+ (formats[n].format == XvPacked) ? "packed" : "planar");
+
+ if(formats[n].type == XvRGB) {
+ fprintf(stdout, " depth: %i\n",
+ formats[n].depth);
+
+ fprintf(stdout, " red, green, blue masks: "
+ "0x%x, 0x%x, 0x%x\n",
+ formats[n].red_mask,
+ formats[n].green_mask,
+ formats[n].blue_mask);
+ } else {
+
+ }
+
+
+ }
+ if(formats) XFree(formats);
+ }
+
+ XvFreeEncodingInfo(encodings);
+ }
+
+ }
+
+ XvFreeAdaptorInfo(ainfo);
+ }
+ return 1;
+}
diff --git a/xvinfo.man b/xvinfo.man
new file mode 100644
index 0000000..3f62ddd
--- /dev/null
+++ b/xvinfo.man
@@ -0,0 +1,29 @@
+
+.\" $XFree86: xc/programs/xvinfo/xvinfo.man,v 1.3 2001/01/27 18:21:25 dawes Exp $
+.\"
+.TH xvinfo 1 __vendorversion__
+.SH NAME
+xvinfo - Print out X-Video extension adaptor information
+.SH SYNOPSIS
+.B "xvinfo"
+[-display \fIdisplayname\fP]
+.SH DESCRIPTION
+.PP
+.B xvinfo
+prints out the capabilities of any video adaptors associated
+with the display that are accesible through the X-Video extension.
+.SH OPTIONS
+.PP
+.TP 8
+.B "-display \fIdisplay\fP"
+This argument allows you to specify the server to query; see \fIX(__miscmansuffix__)\fP.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+This variable may be used to specify the server to query.
+
+.SH SEE ALSO
+xdpyinfo(1)
+.SH AUTHORS
+Mark Vojkovich