162
std::string buftype2s(int type)
165
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
166
return "Video Capture";
167
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
168
return "Video Capture Multiplanar";
169
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
170
return "Video Output";
171
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
172
return "Video Output Multiplanar";
173
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
174
return "Video Overlay";
175
case V4L2_BUF_TYPE_VBI_CAPTURE:
176
return "VBI Capture";
177
case V4L2_BUF_TYPE_VBI_OUTPUT:
179
case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
180
return "Sliced VBI Capture";
181
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
182
return "Sliced VBI Output";
183
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
184
return "Video Output Overlay";
185
case V4L2_BUF_TYPE_PRIVATE:
188
return std::string("Unknown");
162
192
const char *ok(int res)
164
194
static char buf[100];
210
240
struct v4l2_capability vcap;
213
if (doioctl(node, VIDIOC_QUERYCAP, &vcap))
214
return fail("VIDIOC_QUERYCAP not implemented\n");
215
if (check_ustring(vcap.driver, sizeof(vcap.driver)))
216
return fail("invalid driver name\n");
217
if (check_ustring(vcap.card, sizeof(vcap.card)))
218
return fail("invalid card name\n");
243
// Must always be there
244
fail_on_test(doioctl(node, VIDIOC_QUERYCAP, &vcap));
245
fail_on_test(check_ustring(vcap.driver, sizeof(vcap.driver)));
246
fail_on_test(check_ustring(vcap.card, sizeof(vcap.card)));
219
247
if (check_ustring(vcap.bus_info, sizeof(vcap.bus_info))) {
220
if (vcap.bus_info[0])
221
return fail("invalid bus_info\n");
223
warn("VIDIOC_QUERYCAP: empty bus_info\n");
248
fail_on_test(vcap.bus_info[0]);
249
warn("VIDIOC_QUERYCAP: empty bus_info\n");
225
if (check_0(vcap.reserved, sizeof(vcap.reserved)))
226
return fail("non-zero reserved fields\n");
251
fail_on_test(check_0(vcap.reserved, sizeof(vcap.reserved)));
227
252
caps = vcap.capabilities;
229
return fail("no capabilities set\n");
230
if (node->is_video && !(caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT |
231
V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_OUTPUT_OVERLAY)))
232
return fail("video node without the relevant capabilities\n");
233
if (node->is_radio && !(caps & (V4L2_CAP_RADIO | V4L2_CAP_MODULATOR)))
234
return fail("radio node without the relevant capabilities\n");
235
if (node->is_radio && (caps & V4L2_CAP_AUDIO))
236
return fail("radio node cannot have CAP_AUDIO set\n");
237
if (node->is_vbi && !(caps & (V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_CAPTURE |
238
V4L2_CAP_VBI_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT)))
239
return fail("vbi node without the relevant capabilities\n");
253
fail_on_test(vcap.capabilities == 0);
254
fail_on_test(node->is_video && !(caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT |
255
V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_OUTPUT_OVERLAY)));
256
fail_on_test(node->is_radio && !(caps & (V4L2_CAP_RADIO | V4L2_CAP_MODULATOR)));
257
// V4L2_CAP_AUDIO is invalid for radio
258
fail_on_test(node->is_radio && (caps & V4L2_CAP_AUDIO));
259
fail_on_test(node->is_vbi && !(caps & (V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_CAPTURE |
260
V4L2_CAP_VBI_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT)));
261
// You can't have both set due to missing buffer type in VIDIOC_G/S_FBUF
262
fail_on_test((caps & (V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_OUTPUT_OVERLAY)) ==
263
(V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_OUTPUT_OVERLAY));
243
268
static int check_prio(struct node *node, struct node *node2, enum v4l2_priority match)
245
270
enum v4l2_priority prio;
248
err = doioctl(node, VIDIOC_G_PRIORITY, &prio);
250
return fail("VIDIOC_G_PRIORITY failed\n");
252
return fail("wrong priority returned (%d, expected %d)\n", prio, match);
253
if (doioctl(node2, VIDIOC_G_PRIORITY, &prio))
254
return fail("second VIDIOC_G_PRIORITY failed\n");
256
return fail("wrong priority returned on second fh (%d, expected %d)\n", prio, match);
272
// Must be able to get priority
273
fail_on_test(doioctl(node, VIDIOC_G_PRIORITY, &prio));
274
// Must match the expected prio
275
fail_on_test(prio != match);
276
fail_on_test(doioctl(node2, VIDIOC_G_PRIORITY, &prio));
277
fail_on_test(prio != match);
269
290
prio = V4L2_PRIORITY_RECORD;
270
if (doioctl(node, VIDIOC_S_PRIORITY, &prio))
271
return fail("VIDIOC_S_PRIORITY RECORD failed\n");
272
if (check_prio(node, node2, V4L2_PRIORITY_RECORD))
273
return fail("expected priority RECORD");
291
// Must be able to change priority
292
fail_on_test(doioctl(node, VIDIOC_S_PRIORITY, &prio));
293
// Must match the new prio
294
fail_on_test(check_prio(node, node2, V4L2_PRIORITY_RECORD));
275
296
prio = V4L2_PRIORITY_INTERACTIVE;
276
if (!doioctl(node2, VIDIOC_S_PRIORITY, &prio))
277
return fail("Can lower prio on second filehandle\n");
297
// Going back to interactive on the other node must fail
298
fail_on_test(!doioctl(node2, VIDIOC_S_PRIORITY, &prio));
278
299
prio = V4L2_PRIORITY_INTERACTIVE;
279
if (doioctl(node, VIDIOC_S_PRIORITY, &prio))
280
return fail("Could not lower prio\n");
281
if (check_prio(node, node2, V4L2_PRIORITY_INTERACTIVE))
282
return fail("expected priority INTERACTIVE");
300
// Changing it on the first node must work.
301
fail_on_test(doioctl(node, VIDIOC_S_PRIORITY, &prio));
302
fail_on_test(check_prio(node, node2, V4L2_PRIORITY_INTERACTIVE));
547
568
printf("\ttest VIDIOC_G/S_DV_TIMINGS: %s\n", ok(testCustomTimings(&node)));
573
printf("Format ioctls:\n");
574
printf("\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", ok(testEnumFormats(&node)));
575
printf("\ttest VIDIOC_G_FBUF: %s\n", ok(testFBuf(&node)));
576
printf("\ttest VIDIOC_G_FMT: %s\n", ok(testFormats(&node)));
577
printf("\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", ok(testSlicedVBICap(&node)));
552
581
VIDIOC_CROPCAP, VIDIOC_G/S_CROP
553
VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS
554
VIDIOC_G/S_FBUF/OVERLAY
582
VIDIOC_S_FBUF/OVERLAY
557
585
VIDIOC_G/S_JPEGCOMP
558
VIDIOC_SLICED_VBI_CAP
559
586
VIDIOC_S_HW_FREQ_SEEK
560
587
VIDIOC_SUBSCRIBE_EVENT/UNSUBSCRIBE_EVENT/DQEVENT
561
588
VIDIOC_(TRY_)ENCODER_CMD