xvinfo.c revision 405c8079
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include <X11/X.h>
6#include <X11/Xlib.h>
7#include <X11/extensions/Xvlib.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11#include <ctype.h>
12
13static void _X_NORETURN
14PrintUsage(void)
15{
16    fprintf(stderr, "Usage:  xvinfo [-display host:dpy] [-short] [-version]\n");
17    exit(0);
18}
19
20int
21main(int argc, char *argv[])
22{
23    Display *dpy;
24    unsigned int ver, rev, eventB, reqB, errorB;
25    int i, j, k, n;
26    unsigned int nencode, nadaptors;
27    int nscreens, nattr, numImages;
28    XvAdaptorInfo *ainfo;
29    XvAttribute *attributes;
30    XvEncodingInfo *encodings;
31    XvFormat *format;
32    XvImageFormatValues *formats;
33    char *disname = NULL;
34    char shortmode = 0;
35
36    if ((argc > 4))
37        PrintUsage();
38
39    if (argc != 1) {
40        for (i = 1; i < argc; i++) {
41            if (!strcmp(argv[i], "-display")) {
42                disname = argv[i + 1];
43                i++;
44            }
45            else if (!strcmp(argv[i], "-short"))
46                shortmode = 1;
47            else if (!strcmp(argv[i], "-version")) {
48                printf("%s\n", PACKAGE_STRING);
49                exit(0);
50            }
51            else {
52                PrintUsage();
53            }
54        }
55    }
56
57    if (!(dpy = XOpenDisplay(disname))) {
58        fprintf(stderr, "xvinfo:  Unable to open display %s\n",
59                (disname != NULL) ? disname : XDisplayName(NULL));
60        exit(-1);
61    }
62
63    if ((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) {
64        fprintf(stderr, "xvinfo: No X-Video Extension on %s\n",
65                (disname != NULL) ? disname : XDisplayName(NULL));
66        exit(0);
67    }
68    else {
69        fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev);
70    }
71
72    nscreens = ScreenCount(dpy);
73
74    for (i = 0; i < nscreens; i++) {
75        fprintf(stdout, "screen #%i\n", i);
76        XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo);
77
78        if (!nadaptors) {
79            fprintf(stdout, " no adaptors present\n");
80            continue;
81        }
82
83        for (j = 0; j < nadaptors; j++) {
84            fprintf(stdout, "  Adaptor #%i: \"%s\"\n", j, ainfo[j].name);
85            fprintf(stdout, "    number of ports: %li\n", ainfo[j].num_ports);
86            fprintf(stdout, "    port base: %li\n", ainfo[j].base_id);
87            fprintf(stdout, "    operations supported: ");
88            switch (ainfo[j].type & (XvInputMask | XvOutputMask)) {
89            case XvInputMask:
90                if (ainfo[j].type & XvVideoMask)
91                    fprintf(stdout, "PutVideo ");
92                if (ainfo[j].type & XvStillMask)
93                    fprintf(stdout, "PutStill ");
94                if (ainfo[j].type & XvImageMask)
95                    fprintf(stdout, "PutImage ");
96                break;
97            case XvOutputMask:
98                if (ainfo[j].type & XvVideoMask)
99                    fprintf(stdout, "GetVideo ");
100                if (ainfo[j].type & XvStillMask)
101                    fprintf(stdout, "GetStill ");
102                break;
103            default:
104                fprintf(stdout, "none ");
105                break;
106            }
107            fprintf(stdout, "\n");
108
109            format = ainfo[j].formats;
110
111            if (!shortmode) {
112                fprintf(stdout, "    supported visuals:\n");
113                for (k = 0; k < ainfo[j].num_formats; k++, format++) {
114                    fprintf(stdout, "      depth %i, visualID 0x%2lx\n",
115                            format->depth, format->visual_id);
116                }
117            }
118
119            attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr);
120
121            if (attributes && nattr) {
122                fprintf(stdout, "    number of attributes: %i\n", nattr);
123
124                for (k = 0; k < nattr; k++) {
125                    fprintf(stdout, "      \"%s\" (range %i to %i)\n",
126                            attributes[k].name,
127                            attributes[k].min_value, attributes[k].max_value);
128
129                    if (attributes[k].flags & XvSettable) {
130                        if (!shortmode)
131                            fprintf(stdout,
132                                    "              client settable attribute\n");
133                        else
134                            fprintf(stdout, "              settable");
135                    }
136
137                    if (attributes[k].flags & XvGettable) {
138                        Atom the_atom;
139
140                        int value;
141
142                        if (!shortmode)
143                            fprintf(stdout,
144                                    "              client gettable attribute");
145                        else
146                            fprintf(stdout, ", gettable");
147
148                        the_atom = XInternAtom(dpy, attributes[k].name, True);
149
150                        if (the_atom != None) {
151                            if ((Success == XvGetPortAttribute(dpy,
152                                                               ainfo[j].base_id,
153                                                               the_atom,
154                                                               &value)))
155                                fprintf(stdout, " (current value is %i)",
156                                        value);
157                        }
158                        fprintf(stdout, "\n");
159                    }
160                    else if (shortmode)
161                        fprintf(stdout, "\n");
162
163                }
164                XFree(attributes);
165            }
166            else {
167                fprintf(stdout, "    no port attributes defined\n");
168            }
169
170            XvQueryEncodings(dpy, ainfo[j].base_id, &nencode, &encodings);
171
172            if (encodings && nencode) {
173                int ImageEncodings = 0;
174
175                for (n = 0; n < nencode; n++) {
176                    if (!strcmp(encodings[n].name, "XV_IMAGE"))
177                        ImageEncodings++;
178                }
179
180                if (nencode - ImageEncodings) {
181                    fprintf(stdout, "    number of encodings: %i\n",
182                            nencode - ImageEncodings);
183
184                    for (n = 0; n < nencode; n++) {
185                        if (strcmp(encodings[n].name, "XV_IMAGE")) {
186                            fprintf(stdout, "      encoding ID #%li: \"%s\"\n",
187                                    encodings[n].encoding_id,
188                                    encodings[n].name);
189                            fprintf(stdout, "        size: %li x %li\n",
190                                    encodings[n].width, encodings[n].height);
191                            fprintf(stdout, "        rate: %f\n",
192                                    (float) encodings[n].rate.numerator /
193                                    (float) encodings[n].rate.denominator);
194                        }
195                    }
196                }
197
198                if (ImageEncodings && (ainfo[j].type & XvImageMask)) {
199                    char imageName[5];
200
201                    for (n = 0; n < nencode; n++) {
202                        if (!strcmp(encodings[n].name, "XV_IMAGE")) {
203                            fprintf(stdout,
204                                    "    maximum XvImage size: %li x %li\n",
205                                    encodings[n].width, encodings[n].height);
206                            break;
207                        }
208                    }
209
210                    formats =
211                        XvListImageFormats(dpy, ainfo[j].base_id, &numImages);
212
213                    fprintf(stdout, "    Number of image formats: %i\n",
214                            numImages);
215
216                    for (n = 0; n < numImages; n++) {
217                        sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff,
218                                (formats[n].id >> 8) & 0xff,
219                                (formats[n].id >> 16) & 0xff,
220                                (formats[n].id >> 24) & 0xff);
221                        fprintf(stdout, "      id: 0x%x", formats[n].id);
222                        if (isprint(imageName[0]) && isprint(imageName[1]) &&
223                            isprint(imageName[2]) && isprint(imageName[3])) {
224                            fprintf(stdout, " (%s)\n", imageName);
225                        }
226                        else {
227                            fprintf(stdout, "\n");
228                        }
229                        if (!shortmode) {
230                            fprintf(stdout, "        guid: ");
231                            fprintf(stdout, "%02x", (unsigned char)
232                                    formats[n].guid[0]);
233                            fprintf(stdout, "%02x", (unsigned char)
234                                    formats[n].guid[1]);
235                            fprintf(stdout, "%02x", (unsigned char)
236                                    formats[n].guid[2]);
237                            fprintf(stdout, "%02x-", (unsigned char)
238                                    formats[n].guid[3]);
239                            fprintf(stdout, "%02x", (unsigned char)
240                                    formats[n].guid[4]);
241                            fprintf(stdout, "%02x-", (unsigned char)
242                                    formats[n].guid[5]);
243                            fprintf(stdout, "%02x", (unsigned char)
244                                    formats[n].guid[6]);
245                            fprintf(stdout, "%02x-", (unsigned char)
246                                    formats[n].guid[7]);
247                            fprintf(stdout, "%02x", (unsigned char)
248                                    formats[n].guid[8]);
249                            fprintf(stdout, "%02x-", (unsigned char)
250                                    formats[n].guid[9]);
251                            fprintf(stdout, "%02x", (unsigned char)
252                                    formats[n].guid[10]);
253                            fprintf(stdout, "%02x", (unsigned char)
254                                    formats[n].guid[11]);
255                            fprintf(stdout, "%02x", (unsigned char)
256                                    formats[n].guid[12]);
257                            fprintf(stdout, "%02x", (unsigned char)
258                                    formats[n].guid[13]);
259                            fprintf(stdout, "%02x", (unsigned char)
260                                    formats[n].guid[14]);
261                            fprintf(stdout, "%02x\n", (unsigned char)
262                                    formats[n].guid[15]);
263
264                            fprintf(stdout, "        bits per pixel: %i\n",
265                                    formats[n].bits_per_pixel);
266                            fprintf(stdout, "        number of planes: %i\n",
267                                    formats[n].num_planes);
268                            fprintf(stdout, "        type: %s (%s)\n",
269                                    (formats[n].type == XvRGB) ? "RGB" : "YUV",
270                                    (formats[n].format ==
271                                     XvPacked) ? "packed" : "planar");
272
273                            if (formats[n].type == XvRGB) {
274                                fprintf(stdout, "        depth: %i\n",
275                                        formats[n].depth);
276
277                                fprintf(stdout,
278                                        "        red, green, blue masks: "
279                                        "0x%x, 0x%x, 0x%x\n",
280                                        formats[n].red_mask,
281                                        formats[n].green_mask,
282                                        formats[n].blue_mask);
283                            }
284                            else {
285
286                            }
287                        }
288
289                    }
290                    if (formats)
291                        XFree(formats);
292                }
293
294                XvFreeEncodingInfo(encodings);
295            }
296
297        }
298
299        XvFreeAdaptorInfo(ainfo);
300    }
301    return 1;
302}
303