5 #include <X11/XCB/xcb.h>
6 #include <X11/XCB/xv.h>
8 static void PrintUsage()
10 fprintf(stderr, "Usage: xvinfo [-display host:dpy]\n");
14 XCBSCREEN *ScreenOfDisplay (XCBConnection *c, int screen)
16 XCBSCREENIter iter = XCBConnSetupSuccessRepRootsIter (XCBGetSetup (c));
17 for (; iter.rem; --screen, XCBSCREENNext (&iter))
23 static int nstrcmp(char *b, int n, char *s) {
35 * Copies a string s of size n and returns it with a NULL appended.
36 * String returned is allocated with malloc and should be freed later.
38 static char *ExtractString(char *s, int n) {
40 str = (char *)malloc(sizeof(char) * (n+1));
46 int main(int argc, char *argv[])
50 char *display_name = NULL;
52 XCBWINDOW root_window = {0};
54 XCBXvQueryExtensionRep *query_ext;
55 XCBXvQueryAdaptorsRep *adaptors_rep;
56 XCBXvAdaptorInfoIter adaptors_iter;
57 XCBXvAdaptorInfo *ainfo;
59 XCBXvQueryPortAttributesRep *attr_rep;
60 XCBXvAttributeInfoIter attr_iter;
61 XCBXvAttributeInfo *attribute;
63 int nscreens, nattr, i, j, k;
65 if ((argc != 1) && (argc != 3))
69 if (strcmp(argv[1], "-display"))
71 display_name = argv[2];
74 if (!display_name) display_name = getenv("DISPLAY");
75 if (!(c = XCBConnect(display_name, &scrn)))
77 fprintf(stderr, "xcbxvinfo: Unable to open display %s\n", display_name);
81 if (!(query_ext = XCBXvQueryExtensionReply(c, XCBXvQueryExtension(c), NULL)))
83 fprintf(stderr, "xvinfo: No X-Video extension on %s\n", display_name);
88 fprintf(stdout, "X-Video Extension version %i.%i\n", query_ext->major, query_ext->minor);
93 nscreens = XCBConnSetupSuccessRepRootsIter(XCBGetSetup(c)).rem;
95 for (i = 0; i < nscreens; i++)
97 fprintf(stdout, "screen #%i\n", i);
99 screen = ScreenOfDisplay(c, scrn);
100 if (screen) root_window = screen->root;
102 adaptors_rep = XCBXvQueryAdaptorsReply(c, XCBXvQueryAdaptors(c, root_window), NULL);
103 if (!adaptors_rep->num_adaptors) {
104 fprintf(stdout, " no adaptors present.\n");
108 adaptors_iter = XCBXvQueryAdaptorsInfoIter(adaptors_rep);
110 for (j = 0; j < adaptors_rep->num_adaptors; j++)
112 ainfo = adaptors_iter.data;
113 name = ExtractString(XCBXvAdaptorInfoName(ainfo), XCBXvAdaptorInfoNameLength(ainfo));
114 fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, name);
115 fprintf(stdout, " number of ports: %i\n", ainfo->num_ports);
116 fprintf(stdout, " port base: %li\n", ainfo->base_id.xid);
117 fprintf(stdout, " operations supported: ");
120 switch(ainfo->type & (XCBXvTypeInputMask | XCBXvTypeOutputMask)) {
121 case XCBXvTypeInputMask:
122 if (ainfo->type & XCBXvTypeVideoMask)
123 fprintf(stdout, "PutVideo ");
124 if (ainfo->type & XCBXvTypeStillMask)
125 fprintf(stdout, "PutStill ");
126 if (ainfo->type & XCBXvTypeImageMask)
127 fprintf(stdout, "PutImage ");
129 case XCBXvTypeOutputMask:
130 if (ainfo->type & XCBXvTypeVideoMask)
131 fprintf(stdout, "GetVideo ");
132 if (ainfo->type & XCBXvTypeStillMask)
133 fprintf(stdout, "GetStill ");
136 fprintf(stdout, "none ");
139 fprintf(stdout, "\n");
141 format = XCBXvAdaptorInfoFormats(ainfo);
143 fprintf(stdout, " supported visuals:\n");
144 for (k=0; k < ainfo->num_formats; k++, format++)
145 fprintf(stdout, " depth %i, visualID 0x%2lx\n",
146 format->depth, format->visual.id);
148 attr_rep = XCBXvQueryPortAttributesReply(c,
149 XCBXvQueryPortAttributes(c, ainfo->base_id), NULL);
150 nattr = attr_rep->num_attributes;
151 attr_iter = XCBXvQueryPortAttributesAttributesIter(attr_rep);
154 fprintf(stdout, " number of attributes: %i\n", nattr);
156 for (k = 0; k < nattr; k++) {
157 attribute = attr_iter.data;
158 fprintf(stdout, " \"%s\" (range %li to %li)\n",
159 XCBXvAttributeInfoName(attribute),
163 if (attribute->flags & XCBXvAttributeFlagSettable)
164 fprintf(stdout, " client settable attribute\n");
166 if (attribute->flags & XCBXvAttributeFlagGettable) {
168 XCBInternAtomRep *atom_rep;
170 fprintf(stdout, " client gettable attribute");
172 atom_rep = XCBInternAtomReply(c,
175 /*XCBXvAttributeInfoNameLength(attribute),*/
176 strlen(XCBXvAttributeInfoName(attribute)),
177 XCBXvAttributeInfoName(attribute)),
179 the_atom = atom_rep->atom;
181 if (the_atom.xid != 0) {
182 XCBXvGetPortAttributeRep *pattr_rep =
183 XCBXvGetPortAttributeReply(c,
184 XCBXvGetPortAttribute(c, ainfo->base_id, the_atom),
186 if (pattr_rep) fprintf(stdout, " (current value is %li)", pattr_rep->value);
189 fprintf(stdout, "\n");
192 XCBXvAttributeInfoNext(&attr_iter);
196 fprintf(stdout, " no port attributes defined\n");
199 XCBXvQueryEncodingsRep *qencodings_rep;
200 qencodings_rep = XCBXvQueryEncodingsReply(c, XCBXvQueryEncodings(c, ainfo->base_id), NULL);
201 int nencode = qencodings_rep->num_encodings;
202 XCBXvEncodingInfoIter encoding_iter = XCBXvQueryEncodingsInfoIter(qencodings_rep);
203 XCBXvEncodingInfo *encoding;
205 int ImageEncodings = 0;
208 for (n = 0; n < nencode; n++) {
209 encoding = encoding_iter.data;
210 name = ExtractString(XCBXvEncodingInfoName(encoding), XCBXvEncodingInfoNameLength(encoding));
211 if (!nstrcmp(name, strlen(name), "XV_IMAGE"))
213 XCBXvEncodingInfoNext(&encoding_iter);
217 if(nencode - ImageEncodings) {
218 fprintf(stdout, " number of encodings: %i\n", nencode - ImageEncodings);
220 /* Reset the iter. */
221 encoding_iter = XCBXvQueryEncodingsInfoIter(qencodings_rep);
222 for(n = 0; n < nencode; n++) {
223 encoding = encoding_iter.data;
224 name = ExtractString(XCBXvEncodingInfoName(encoding), XCBXvEncodingInfoNameLength(encoding));
225 if(nstrcmp(name, strlen(name), "XV_IMAGE")) {
227 " encoding ID #%li: \"%*s\"\n",
228 encoding->encoding.xid,
231 fprintf(stdout, " size: %i x %i\n",
234 fprintf(stdout, " rate: %f\n",
235 (float)encoding->rate.numerator/
236 (float)encoding->rate.denominator);
239 XCBXvEncodingInfoNext(&encoding_iter);
243 if(ImageEncodings && (ainfo->type & XCBXvTypeImageMask)) {
244 char imageName[5] = {0, 0, 0, 0, 0};
245 encoding_iter = XCBXvQueryEncodingsInfoIter(qencodings_rep);
246 for(n = 0; n < nencode; n++) {
247 encoding = encoding_iter.data;
248 name = ExtractString(XCBXvEncodingInfoName(encoding), XCBXvEncodingInfoNameLength(encoding));
249 if(!nstrcmp(name, strlen(name), "XV_IMAGE")) {
251 " maximum XvImage size: %i x %i\n",
252 encoding->width, encoding->height);
257 XCBXvListImageFormatsRep *formats_rep;
258 formats_rep = XCBXvListImageFormatsReply(c,
259 XCBXvListImageFormats(c, ainfo->base_id),
262 int numImages = formats_rep->num_formats;
263 XCBXvImageFormatInfo *format;
264 XCBXvImageFormatInfoIter formats_iter = XCBXvListImageFormatsFormatIter(formats_rep);
265 fprintf(stdout, " Number of image formats: %i\n",
268 for(n = 0; n < numImages; n++) {
269 format = formats_iter.data;
270 memcpy(imageName, &(format->id), 4);
271 fprintf(stdout, " id: 0x%lx", format->id);
272 if(isprint(imageName[0]) && isprint(imageName[1]) &&
273 isprint(imageName[2]) && isprint(imageName[3]))
275 fprintf(stdout, " (%s)\n", imageName);
277 fprintf(stdout, "\n");
279 fprintf(stdout, " guid: ");
280 fprintf(stdout, "%02x", (unsigned char)
282 fprintf(stdout, "%02x", (unsigned char)
284 fprintf(stdout, "%02x", (unsigned char)
286 fprintf(stdout, "%02x-", (unsigned char)
288 fprintf(stdout, "%02x", (unsigned char)
290 fprintf(stdout, "%02x-", (unsigned char)
292 fprintf(stdout, "%02x", (unsigned char)
294 fprintf(stdout, "%02x-", (unsigned char)
296 fprintf(stdout, "%02x", (unsigned char)
298 fprintf(stdout, "%02x-", (unsigned char)
300 fprintf(stdout, "%02x", (unsigned char)
302 fprintf(stdout, "%02x", (unsigned char)
304 fprintf(stdout, "%02x", (unsigned char)
306 fprintf(stdout, "%02x", (unsigned char)
308 fprintf(stdout, "%02x", (unsigned char)
310 fprintf(stdout, "%02x\n", (unsigned char)
313 fprintf(stdout, " bits per pixel: %i\n",
315 fprintf(stdout, " number of planes: %i\n",
317 fprintf(stdout, " type: %s (%s)\n",
318 (format->type == XCBXvImageFormatInfoTypeRGB) ? "RGB" : "YUV",
319 (format->format == XCBXvImageFormatInfoFormatPacked) ? "packed" : "planar");
321 if(format->type == XCBXvImageFormatInfoTypeRGB) {
322 fprintf(stdout, " depth: %i\n",
325 fprintf(stdout, " red, green, blue masks: "
326 "0x%lx, 0x%lx, 0x%lx\n",
333 XCBXvImageFormatInfoNext(&formats_iter);
338 free(qencodings_rep);
339 XCBXvAdaptorInfoNext(&adaptors_iter);