xvinfo.c revision 405c8079
1405c8079Smrg#ifdef HAVE_CONFIG_H
2405c8079Smrg# include "config.h"
3405c8079Smrg#endif
4405c8079Smrg
58ae04fa6Smrg#include <X11/X.h>
68ae04fa6Smrg#include <X11/Xlib.h>
78ae04fa6Smrg#include <X11/extensions/Xvlib.h>
88ae04fa6Smrg#include <stdio.h>
98ae04fa6Smrg#include <stdlib.h>
108ae04fa6Smrg#include <string.h>
118ae04fa6Smrg#include <ctype.h>
128ae04fa6Smrg
13405c8079Smrgstatic void _X_NORETURN
148ae04fa6SmrgPrintUsage(void)
158ae04fa6Smrg{
16405c8079Smrg    fprintf(stderr, "Usage:  xvinfo [-display host:dpy] [-short] [-version]\n");
17405c8079Smrg    exit(0);
188ae04fa6Smrg}
198ae04fa6Smrg
20405c8079Smrgint
21405c8079Smrgmain(int argc, char *argv[])
228ae04fa6Smrg{
238ae04fa6Smrg    Display *dpy;
24405c8079Smrg    unsigned int ver, rev, eventB, reqB, errorB;
25405c8079Smrg    int i, j, k, n;
268ae04fa6Smrg    unsigned int nencode, nadaptors;
278ae04fa6Smrg    int nscreens, nattr, numImages;
288ae04fa6Smrg    XvAdaptorInfo *ainfo;
298ae04fa6Smrg    XvAttribute *attributes;
308ae04fa6Smrg    XvEncodingInfo *encodings;
318ae04fa6Smrg    XvFormat *format;
328ae04fa6Smrg    XvImageFormatValues *formats;
33405c8079Smrg    char *disname = NULL;
3444af7230Smrg    char shortmode = 0;
358ae04fa6Smrg
36405c8079Smrg    if ((argc > 4))
37405c8079Smrg        PrintUsage();
38405c8079Smrg
39405c8079Smrg    if (argc != 1) {
40405c8079Smrg        for (i = 1; i < argc; i++) {
41405c8079Smrg            if (!strcmp(argv[i], "-display")) {
42405c8079Smrg                disname = argv[i + 1];
43405c8079Smrg                i++;
44405c8079Smrg            }
45405c8079Smrg            else if (!strcmp(argv[i], "-short"))
46405c8079Smrg                shortmode = 1;
47405c8079Smrg            else if (!strcmp(argv[i], "-version")) {
48405c8079Smrg                printf("%s\n", PACKAGE_STRING);
49405c8079Smrg                exit(0);
50405c8079Smrg            }
51405c8079Smrg            else {
52405c8079Smrg                PrintUsage();
53405c8079Smrg            }
54405c8079Smrg        }
558ae04fa6Smrg    }
568ae04fa6Smrg
57405c8079Smrg    if (!(dpy = XOpenDisplay(disname))) {
58405c8079Smrg        fprintf(stderr, "xvinfo:  Unable to open display %s\n",
59405c8079Smrg                (disname != NULL) ? disname : XDisplayName(NULL));
60405c8079Smrg        exit(-1);
618ae04fa6Smrg    }
628ae04fa6Smrg
63405c8079Smrg    if ((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) {
64405c8079Smrg        fprintf(stderr, "xvinfo: No X-Video Extension on %s\n",
65405c8079Smrg                (disname != NULL) ? disname : XDisplayName(NULL));
66405c8079Smrg        exit(0);
67405c8079Smrg    }
68405c8079Smrg    else {
69405c8079Smrg        fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev);
708ae04fa6Smrg    }
718ae04fa6Smrg
728ae04fa6Smrg    nscreens = ScreenCount(dpy);
738ae04fa6Smrg
74405c8079Smrg    for (i = 0; i < nscreens; i++) {
75405c8079Smrg        fprintf(stdout, "screen #%i\n", i);
76405c8079Smrg        XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo);
77405c8079Smrg
78405c8079Smrg        if (!nadaptors) {
79405c8079Smrg            fprintf(stdout, " no adaptors present\n");
80405c8079Smrg            continue;
81405c8079Smrg        }
82405c8079Smrg
83405c8079Smrg        for (j = 0; j < nadaptors; j++) {
84405c8079Smrg            fprintf(stdout, "  Adaptor #%i: \"%s\"\n", j, ainfo[j].name);
85405c8079Smrg            fprintf(stdout, "    number of ports: %li\n", ainfo[j].num_ports);
86405c8079Smrg            fprintf(stdout, "    port base: %li\n", ainfo[j].base_id);
87405c8079Smrg            fprintf(stdout, "    operations supported: ");
88405c8079Smrg            switch (ainfo[j].type & (XvInputMask | XvOutputMask)) {
89405c8079Smrg            case XvInputMask:
90405c8079Smrg                if (ainfo[j].type & XvVideoMask)
91405c8079Smrg                    fprintf(stdout, "PutVideo ");
92405c8079Smrg                if (ainfo[j].type & XvStillMask)
93405c8079Smrg                    fprintf(stdout, "PutStill ");
94405c8079Smrg                if (ainfo[j].type & XvImageMask)
95405c8079Smrg                    fprintf(stdout, "PutImage ");
96405c8079Smrg                break;
97405c8079Smrg            case XvOutputMask:
98405c8079Smrg                if (ainfo[j].type & XvVideoMask)
99405c8079Smrg                    fprintf(stdout, "GetVideo ");
100405c8079Smrg                if (ainfo[j].type & XvStillMask)
101405c8079Smrg                    fprintf(stdout, "GetStill ");
102405c8079Smrg                break;
103405c8079Smrg            default:
104405c8079Smrg                fprintf(stdout, "none ");
105405c8079Smrg                break;
106405c8079Smrg            }
107405c8079Smrg            fprintf(stdout, "\n");
108405c8079Smrg
109405c8079Smrg            format = ainfo[j].formats;
110405c8079Smrg
111405c8079Smrg            if (!shortmode) {
112405c8079Smrg                fprintf(stdout, "    supported visuals:\n");
113405c8079Smrg                for (k = 0; k < ainfo[j].num_formats; k++, format++) {
114405c8079Smrg                    fprintf(stdout, "      depth %i, visualID 0x%2lx\n",
115405c8079Smrg                            format->depth, format->visual_id);
116405c8079Smrg                }
117405c8079Smrg            }
118405c8079Smrg
119405c8079Smrg            attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr);
120405c8079Smrg
121405c8079Smrg            if (attributes && nattr) {
122405c8079Smrg                fprintf(stdout, "    number of attributes: %i\n", nattr);
123405c8079Smrg
124405c8079Smrg                for (k = 0; k < nattr; k++) {
125405c8079Smrg                    fprintf(stdout, "      \"%s\" (range %i to %i)\n",
126405c8079Smrg                            attributes[k].name,
127405c8079Smrg                            attributes[k].min_value, attributes[k].max_value);
128405c8079Smrg
129405c8079Smrg                    if (attributes[k].flags & XvSettable) {
130405c8079Smrg                        if (!shortmode)
131405c8079Smrg                            fprintf(stdout,
132405c8079Smrg                                    "              client settable attribute\n");
133405c8079Smrg                        else
134405c8079Smrg                            fprintf(stdout, "              settable");
135405c8079Smrg                    }
136405c8079Smrg
137405c8079Smrg                    if (attributes[k].flags & XvGettable) {
138405c8079Smrg                        Atom the_atom;
139405c8079Smrg
140405c8079Smrg                        int value;
141405c8079Smrg
142405c8079Smrg                        if (!shortmode)
143405c8079Smrg                            fprintf(stdout,
144405c8079Smrg                                    "              client gettable attribute");
145405c8079Smrg                        else
146405c8079Smrg                            fprintf(stdout, ", gettable");
147405c8079Smrg
148405c8079Smrg                        the_atom = XInternAtom(dpy, attributes[k].name, True);
149405c8079Smrg
150405c8079Smrg                        if (the_atom != None) {
151405c8079Smrg                            if ((Success == XvGetPortAttribute(dpy,
152405c8079Smrg                                                               ainfo[j].base_id,
153405c8079Smrg                                                               the_atom,
154405c8079Smrg                                                               &value)))
155405c8079Smrg                                fprintf(stdout, " (current value is %i)",
156405c8079Smrg                                        value);
157405c8079Smrg                        }
158405c8079Smrg                        fprintf(stdout, "\n");
159405c8079Smrg                    }
160405c8079Smrg                    else if (shortmode)
161405c8079Smrg                        fprintf(stdout, "\n");
162405c8079Smrg
163405c8079Smrg                }
164405c8079Smrg                XFree(attributes);
165405c8079Smrg            }
166405c8079Smrg            else {
167405c8079Smrg                fprintf(stdout, "    no port attributes defined\n");
168405c8079Smrg            }
169405c8079Smrg
170405c8079Smrg            XvQueryEncodings(dpy, ainfo[j].base_id, &nencode, &encodings);
171405c8079Smrg
172405c8079Smrg            if (encodings && nencode) {
173405c8079Smrg                int ImageEncodings = 0;
174405c8079Smrg
175405c8079Smrg                for (n = 0; n < nencode; n++) {
176405c8079Smrg                    if (!strcmp(encodings[n].name, "XV_IMAGE"))
177405c8079Smrg                        ImageEncodings++;
178405c8079Smrg                }
179405c8079Smrg
180405c8079Smrg                if (nencode - ImageEncodings) {
181405c8079Smrg                    fprintf(stdout, "    number of encodings: %i\n",
182405c8079Smrg                            nencode - ImageEncodings);
183405c8079Smrg
184405c8079Smrg                    for (n = 0; n < nencode; n++) {
185405c8079Smrg                        if (strcmp(encodings[n].name, "XV_IMAGE")) {
186405c8079Smrg                            fprintf(stdout, "      encoding ID #%li: \"%s\"\n",
187405c8079Smrg                                    encodings[n].encoding_id,
188405c8079Smrg                                    encodings[n].name);
189405c8079Smrg                            fprintf(stdout, "        size: %li x %li\n",
190405c8079Smrg                                    encodings[n].width, encodings[n].height);
191405c8079Smrg                            fprintf(stdout, "        rate: %f\n",
192405c8079Smrg                                    (float) encodings[n].rate.numerator /
193405c8079Smrg                                    (float) encodings[n].rate.denominator);
194405c8079Smrg                        }
195405c8079Smrg                    }
196405c8079Smrg                }
197405c8079Smrg
198405c8079Smrg                if (ImageEncodings && (ainfo[j].type & XvImageMask)) {
199405c8079Smrg                    char imageName[5];
200405c8079Smrg
201405c8079Smrg                    for (n = 0; n < nencode; n++) {
202405c8079Smrg                        if (!strcmp(encodings[n].name, "XV_IMAGE")) {
203405c8079Smrg                            fprintf(stdout,
204405c8079Smrg                                    "    maximum XvImage size: %li x %li\n",
205405c8079Smrg                                    encodings[n].width, encodings[n].height);
206405c8079Smrg                            break;
207405c8079Smrg                        }
208405c8079Smrg                    }
209405c8079Smrg
210405c8079Smrg                    formats =
211405c8079Smrg                        XvListImageFormats(dpy, ainfo[j].base_id, &numImages);
212405c8079Smrg
213405c8079Smrg                    fprintf(stdout, "    Number of image formats: %i\n",
214405c8079Smrg                            numImages);
215405c8079Smrg
216405c8079Smrg                    for (n = 0; n < numImages; n++) {
217405c8079Smrg                        sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff,
218405c8079Smrg                                (formats[n].id >> 8) & 0xff,
219405c8079Smrg                                (formats[n].id >> 16) & 0xff,
220405c8079Smrg                                (formats[n].id >> 24) & 0xff);
221405c8079Smrg                        fprintf(stdout, "      id: 0x%x", formats[n].id);
222405c8079Smrg                        if (isprint(imageName[0]) && isprint(imageName[1]) &&
223405c8079Smrg                            isprint(imageName[2]) && isprint(imageName[3])) {
224405c8079Smrg                            fprintf(stdout, " (%s)\n", imageName);
225405c8079Smrg                        }
226405c8079Smrg                        else {
227405c8079Smrg                            fprintf(stdout, "\n");
228405c8079Smrg                        }
229405c8079Smrg                        if (!shortmode) {
230405c8079Smrg                            fprintf(stdout, "        guid: ");
231405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
232405c8079Smrg                                    formats[n].guid[0]);
233405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
234405c8079Smrg                                    formats[n].guid[1]);
235405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
236405c8079Smrg                                    formats[n].guid[2]);
237405c8079Smrg                            fprintf(stdout, "%02x-", (unsigned char)
238405c8079Smrg                                    formats[n].guid[3]);
239405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
240405c8079Smrg                                    formats[n].guid[4]);
241405c8079Smrg                            fprintf(stdout, "%02x-", (unsigned char)
242405c8079Smrg                                    formats[n].guid[5]);
243405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
244405c8079Smrg                                    formats[n].guid[6]);
245405c8079Smrg                            fprintf(stdout, "%02x-", (unsigned char)
246405c8079Smrg                                    formats[n].guid[7]);
247405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
248405c8079Smrg                                    formats[n].guid[8]);
249405c8079Smrg                            fprintf(stdout, "%02x-", (unsigned char)
250405c8079Smrg                                    formats[n].guid[9]);
251405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
252405c8079Smrg                                    formats[n].guid[10]);
253405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
254405c8079Smrg                                    formats[n].guid[11]);
255405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
256405c8079Smrg                                    formats[n].guid[12]);
257405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
258405c8079Smrg                                    formats[n].guid[13]);
259405c8079Smrg                            fprintf(stdout, "%02x", (unsigned char)
260405c8079Smrg                                    formats[n].guid[14]);
261405c8079Smrg                            fprintf(stdout, "%02x\n", (unsigned char)
262405c8079Smrg                                    formats[n].guid[15]);
263405c8079Smrg
264405c8079Smrg                            fprintf(stdout, "        bits per pixel: %i\n",
265405c8079Smrg                                    formats[n].bits_per_pixel);
266405c8079Smrg                            fprintf(stdout, "        number of planes: %i\n",
267405c8079Smrg                                    formats[n].num_planes);
268405c8079Smrg                            fprintf(stdout, "        type: %s (%s)\n",
269405c8079Smrg                                    (formats[n].type == XvRGB) ? "RGB" : "YUV",
270405c8079Smrg                                    (formats[n].format ==
271405c8079Smrg                                     XvPacked) ? "packed" : "planar");
272405c8079Smrg
273405c8079Smrg                            if (formats[n].type == XvRGB) {
274405c8079Smrg                                fprintf(stdout, "        depth: %i\n",
2758ae04fa6Smrg                                        formats[n].depth);
2768ae04fa6Smrg
277405c8079Smrg                                fprintf(stdout,
278405c8079Smrg                                        "        red, green, blue masks: "
279405c8079Smrg                                        "0x%x, 0x%x, 0x%x\n",
280405c8079Smrg                                        formats[n].red_mask,
281405c8079Smrg                                        formats[n].green_mask,
282405c8079Smrg                                        formats[n].blue_mask);
283405c8079Smrg                            }
284405c8079Smrg                            else {
285405c8079Smrg
286405c8079Smrg                            }
287405c8079Smrg                        }
288405c8079Smrg
289405c8079Smrg                    }
290405c8079Smrg                    if (formats)
291405c8079Smrg                        XFree(formats);
292405c8079Smrg                }
293405c8079Smrg
294405c8079Smrg                XvFreeEncodingInfo(encodings);
295405c8079Smrg            }
296405c8079Smrg
297405c8079Smrg        }
298405c8079Smrg
299405c8079Smrg        XvFreeAdaptorInfo(ainfo);
3008ae04fa6Smrg    }
3018ae04fa6Smrg    return 1;
3028ae04fa6Smrg}
303