Example #1
0
int main (int argc, char *argv[])
{
    static const char *args = "/dev/hidrawX";
    HIDPP::DeviceIndex device_index = HIDPP::DefaultDevice;
    bool do_write_tests = false;

    std::vector<Option> options = {
        DeviceIndexOption (device_index),
        VerboseOption (),
        Option ('w', "write",
        Option::NoArgument, "",
        "Also do write tests with HID++ 1.0 devices.",
        [&do_write_tests] (const char *optarg) -> bool {
            do_write_tests = true;
            return true;
        })
    };
    Option help = HelpOption (argv[0], args, &options);
    options.push_back (help);

    int first_arg;
    if (!Option::processOptions (argc, argv, options, first_arg))
        return EXIT_FAILURE;

    if (argc-first_arg != 1) {
        fprintf (stderr, "%s", getUsage (argv[0], args, &options).c_str ());
        return EXIT_FAILURE;
    }

    const char *path = argv[first_arg];

    /*
     * Check protocol version
     */
    unsigned int major, minor;
    try {
        HIDPP::Device dev (path, device_index);
        dev.getProtocolVersion (major, minor);
        printf ("%s (%04hx:%04hx) is a HID++ %d.%d device\n",
                dev.name ().c_str (),
                dev.vendorID (), dev.productID (),
                major, minor);

    }
    catch (HIDPP::Device::NoHIDPPReportException e) {
        printf ("%s is not a HID++ device\n", path);
        return EXIT_FAILURE;
    }
    catch (std::system_error e) {
        fprintf (stderr, "Failed to open %s: %s\n", path, e.what ());
        return EXIT_FAILURE;
    }
    /*
     * HID++ 1.0
     */
    if (major == 1 && minor == 0) {
        HIDPP10::Device dev (path, device_index);

        for (unsigned int address = 0; address < 256; ++address) {
            testRegister (&dev, HIDPP::ShortParamLength, static_cast<uint8_t> (address), do_write_tests);
            testRegister (&dev, HIDPP::LongParamLength, static_cast<uint8_t> (address), do_write_tests);
        }
        if (do_write_tests) {
            try {
                HIDPP10::IIndividualFeatures iif (&dev);
                unsigned int old_flags = iif.flags ();
                iif.setFlags (0x00FFFFFF);
                unsigned int flags = iif.flags ();
                iif.setFlags (old_flags);
                printf ("Individual features: %06x\n", flags);
                if (flags & HIDPP10::IIndividualFeatures::SpecialButtonFunction) {
                    printf (" - Special Button Function\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::EnhancedKeyUsage) {
                    printf (" - Enhanced Key Usage\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::FastForwardRewind) {
                    printf (" - Fast Forward/Rewind\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::ScrollingAcceleration) {
                    printf (" - Scrolling Acceleration\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::ButtonsControlResolution) {
                    printf (" - Buttons Control Resolution\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::InhibitLockKeySound) {
                    printf (" - Inhibit Lock KeyS ound\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::MXAir3DEngine) {
                    printf (" - 3D Engine\n");
                }
                if (flags & HIDPP10::IIndividualFeatures::LEDControl) {
                    printf (" - LED Control\n");
                }
            }
            catch (HIDPP10::Error e) {
                printf ("Individual features: %s\n", e.what ());
            }
        }
    }
    /*
     * HID++ 2.0 and later
     */
    else if (major >= 2) {
        HIDPP20::Device dev (path, device_index);
        HIDPP20::IFeatureSet ifeatureset (&dev);

        unsigned int feature_count = ifeatureset.getCount ();
        for (unsigned int i = 1; i <= feature_count; ++i) {
            uint8_t feature_index = i;
            uint16_t feature_id;
            bool obsolete, hidden;

            feature_id = ifeatureset.getFeatureID (feature_index, &obsolete, &hidden);
            printf ("Feature 0x%02hhx: [0x%04hx]", feature_index, feature_id);
            if (obsolete)
                printf (" obsolete");
            if (hidden)
                printf (" hidden");
            printf ("\n");
        }
    }
    else {
        fprintf (stderr, "Unsupported HID++ protocol version.\n");
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}
Example #2
0
static int32_t
testHookInterface(OMRPortLibrary *portLib, uintptr_t *passCount, uintptr_t *failCount, J9HookInterface **hookInterface)
{
	int32_t rc = 0;
	uintptr_t agent1, agent2, agent2andAHalf, agent3;

	/* all events should be enabled initially */
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE);

	/* disable event1 */
	testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, 0);
	testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, -1);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE);

	/* reserve event2 */
	testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0);
	testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, -1);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE);

	/* register event3 */
	testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 0);
	testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, -1);
	testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 0);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE);
	testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE);

	/* register event2 (which was previously reserved) twice */
	/* (the second register should have no effect) */
	testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0);
	testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0);

	/* trigger an event */
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 1);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 1);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0);

	/* unregister the twice hooked event */
	testUnregister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 1);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0);

	/* unregister the once hooked event */
	testUnregister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0);

	/* allocate some agent IDs */
	agent1 = testAllocateAgentID(portLib, passCount, failCount, hookInterface);
	agent2 = testAllocateAgentID(portLib, passCount, failCount, hookInterface);
	agent2andAHalf = testAllocateAgentID(portLib, passCount, failCount, hookInterface);
	agent3 = testAllocateAgentID(portLib, passCount, failCount, hookInterface);

	/* register the agents in order */
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent1, 1, 0);
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent2, 2, 0);
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent3, 3, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 3);

	/* register the agents in reverse order */
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent3, 3, 0);
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2, 2, 0);
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent1, 1, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 3);

	/* unregister an agent */
	testUnregisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 2);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 2);

	/* register it again with another agent in the same list position*/
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2andAHalf, 2, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 3);

	/* register a first chance istener */
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, J9HOOK_AGENTID_FIRST, 0, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 4);

	/* and a last chance listener */
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, J9HOOK_AGENTID_LAST, 4, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 5);

	/* registering a duplicate listener should have no effect, even if it's a different agent */
	testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2, 3, 0);
	testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 5);

	return rc;
}
Example #3
0
int main(int argc, char **argv)
{
	int i;
	struct node node = { -1 };
	struct node video_node = { -1 };
	struct node video_node2 = { -1 };
	struct node radio_node = { -1, true };
	struct node radio_node2 = { -1, true };
	struct node vbi_node = { -1 };
	struct node vbi_node2 = { -1 };

	/* command args */
	int ch;
	const char *device = NULL;
	const char *video_device = NULL;		/* -d device */
	const char *radio_device = NULL;	/* -r device */
	const char *vbi_device = NULL;		/* -V device */
	struct v4l2_capability vcap;	/* list_cap */
	char short_options[26 * 2 * 2 + 1];
	int idx = 0;

	for (i = 0; long_options[i].name; i++) {
		if (!isalpha(long_options[i].val))
			continue;
		short_options[idx++] = long_options[i].val;
		if (long_options[i].has_arg == required_argument)
			short_options[idx++] = ':';
	}
	while (1) {
		int option_index = 0;

		short_options[idx] = 0;
		ch = getopt_long(argc, argv, short_options,
				 long_options, &option_index);
		if (ch == -1)
			break;

		options[(int)ch] = 1;
		switch (ch) {
		case OptHelp:
			usage();
			return 0;
		case OptSetDevice:
			video_device = optarg;
			if (video_device[0] >= '0' && video_device[0] <= '9' && strlen(video_device) <= 3) {
				static char newdev[20];

				sprintf(newdev, "/dev/video%s", video_device);
				video_device = newdev;
			}
			break;
		case OptSetRadioDevice:
			radio_device = optarg;
			if (radio_device[0] >= '0' && radio_device[0] <= '9' && strlen(radio_device) <= 3) {
				static char newdev[20];

				sprintf(newdev, "/dev/radio%s", radio_device);
				radio_device = newdev;
			}
			break;
		case OptSetVbiDevice:
			vbi_device = optarg;
			if (vbi_device[0] >= '0' && vbi_device[0] <= '9' && strlen(vbi_device) <= 3) {
				static char newdev[20];

				sprintf(newdev, "/dev/vbi%s", vbi_device);
				vbi_device = newdev;
			}
			break;
		case OptNoWarnings:
			show_warnings = false;
			break;
		case OptVerbose:
			show_info = true;
			break;
		case ':':
			fprintf(stderr, "Option `%s' requires a value\n",
				argv[optind]);
			usage();
			return 1;
		case '?':
			fprintf(stderr, "Unknown argument `%s'\n",
				argv[optind]);
			usage();
			return 1;
		}
	}
	if (optind < argc) {
		printf("unknown arguments: ");
		while (optind < argc)
			printf("%s ", argv[optind++]);
		printf("\n");
		usage();
		return 1;
	}
	wrapper = options[OptUseWrapper];

	struct utsname uts;
	int v1, v2, v3;

	uname(&uts);
	sscanf(uts.release, "%d.%d.%d", &v1, &v2, &v3);
	if (v1 == 2 && v2 == 6)
		kernel_version = v3;

	if (!video_device && !radio_device && !vbi_device)
		video_device = "/dev/video0";

	if (video_device && (video_node.fd = test_open(video_device, O_RDWR)) < 0) {
		fprintf(stderr, "Failed to open %s: %s\n", video_device,
			strerror(errno));
		exit(1);
	}

	if (radio_device && (radio_node.fd = test_open(radio_device, O_RDWR)) < 0) {
		fprintf(stderr, "Failed to open %s: %s\n", radio_device,
			strerror(errno));
		exit(1);
	}

	if (vbi_device && (vbi_node.fd = test_open(vbi_device, O_RDWR)) < 0) {
		fprintf(stderr, "Failed to open %s: %s\n", vbi_device,
			strerror(errno));
		exit(1);
	}

	if (video_node.fd >= 0) {
		node.fd = video_node.fd;
		device = video_device;
		node.is_video = true;
	} else if (radio_node.fd >= 0) {
		node.fd = radio_node.fd;
		device = radio_device;
		node.is_radio = true;
		printf("is radio\n");
	} else if (vbi_node.fd >= 0) {
		node.fd = vbi_node.fd;
		device = vbi_device;
		node.is_vbi = true;
	}
	node.device = device;

	doioctl(&node, VIDIOC_QUERYCAP, &vcap);
	if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS)
		node.caps = vcap.device_caps;
	else
		node.caps = vcap.capabilities;
	if (node.caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE |
			 V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_SLICED_VBI_CAPTURE |
			 V4L2_CAP_RDS_CAPTURE | V4L2_CAP_RADIO | V4L2_CAP_TUNER))
		node.has_inputs = true;
	if (node.caps & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VBI_OUTPUT |
			 V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_SLICED_VBI_OUTPUT |
			 V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR))
		node.has_outputs = true;
	if (node.caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE |
			 V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE |
			 V4L2_CAP_VIDEO_M2M | V4L2_CAP_SLICED_VBI_CAPTURE |
			 V4L2_CAP_RDS_CAPTURE))
		node.can_capture = true;
	if (node.caps & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VBI_OUTPUT |
			 V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE |
			 V4L2_CAP_VIDEO_M2M | V4L2_CAP_SLICED_VBI_OUTPUT |
			 V4L2_CAP_RDS_OUTPUT))
		node.can_output = true;

	/* Information Opts */

	if (kernel_version)
		printf("Running on 2.6.%d\n\n", kernel_version);

	printf("Driver Info:\n");
	printf("\tDriver name   : %s\n", vcap.driver);
	printf("\tCard type     : %s\n", vcap.card);
	printf("\tBus info      : %s\n", vcap.bus_info);
	printf("\tDriver version: %d.%d.%d\n",
			vcap.version >> 16,
			(vcap.version >> 8) & 0xff,
			vcap.version & 0xff);
	printf("\tCapabilities  : 0x%08X\n", vcap.capabilities);
	printf("%s", cap2s(vcap.capabilities).c_str());
	if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS) {
		printf("\tDevice Caps   : 0x%08X\n", vcap.device_caps);
		printf("%s", cap2s(vcap.device_caps).c_str());
	}

	printf("\nCompliance test for device %s (%susing libv4l2):\n\n",
			device, wrapper ? "" : "not ");

	/* Required ioctls */

	printf("Required ioctls:\n");
	printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&node)));
	printf("\n");

	/* Multiple opens */

	printf("Allow for multiple opens:\n");
	if (video_device) {
		video_node2 = node;
		printf("\ttest second video open: %s\n",
				ok((video_node2.fd = test_open(video_device, O_RDWR)) < 0));
		if (video_node2.fd >= 0) {
			printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&video_node2)));
			printf("\ttest VIDIOC_G/S_PRIORITY: %s\n",
					ok(testPrio(&node, &video_node2)));
			node.node2 = &video_node2;
		}
	}
	if (radio_device) {
		radio_node2 = node;
		printf("\ttest second radio open: %s\n",
				ok((radio_node2.fd = test_open(radio_device, O_RDWR)) < 0));
		if (radio_node2.fd >= 0) {
			printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&radio_node2)));
			printf("\ttest VIDIOC_G/S_PRIORITY: %s\n",
					ok(testPrio(&node, &radio_node2)));
			node.node2 = &video_node2;
		}
	}
	if (vbi_device) {
		vbi_node2 = node;
		printf("\ttest second vbi open: %s\n",
				ok((vbi_node2.fd = test_open(vbi_device, O_RDWR)) < 0));
		if (vbi_node2.fd >= 0) {
			printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&vbi_node2)));
			printf("\ttest VIDIOC_G/S_PRIORITY: %s\n",
					ok(testPrio(&node, &vbi_node2)));
			node.node2 = &video_node2;
		}
	}
	printf("\n");

	/* Debug ioctls */

	printf("Debug ioctls:\n");
	printf("\ttest VIDIOC_DBG_G/S_REGISTER: %s\n", ok(testRegister(&node)));
	printf("\ttest VIDIOC_LOG_STATUS: %s\n", ok(testLogStatus(&node)));
	printf("\n");

	/* Input ioctls */

	printf("Input ioctls:\n");
	printf("\ttest VIDIOC_G/S_TUNER: %s\n", ok(testTuner(&node)));
	printf("\ttest VIDIOC_G/S_FREQUENCY: %s\n", ok(testTunerFreq(&node)));
	printf("\ttest VIDIOC_S_HW_FREQ_SEEK: %s\n", ok(testTunerHwSeek(&node)));
	printf("\ttest VIDIOC_ENUMAUDIO: %s\n", ok(testEnumInputAudio(&node)));
	printf("\ttest VIDIOC_G/S/ENUMINPUT: %s\n", ok(testInput(&node)));
	printf("\ttest VIDIOC_G/S_AUDIO: %s\n", ok(testInputAudio(&node)));
	printf("\tInputs: %d Audio Inputs: %d Tuners: %d\n",
			node.inputs, node.audio_inputs, node.tuners);
	printf("\n");

	/* Output ioctls */

	printf("Output ioctls:\n");
	printf("\ttest VIDIOC_G/S_MODULATOR: %s\n", ok(testModulator(&node)));
	printf("\ttest VIDIOC_G/S_FREQUENCY: %s\n", ok(testModulatorFreq(&node)));
	printf("\ttest VIDIOC_ENUMAUDOUT: %s\n", ok(testEnumOutputAudio(&node)));
	printf("\ttest VIDIOC_G/S/ENUMOUTPUT: %s\n", ok(testOutput(&node)));
	printf("\ttest VIDIOC_G/S_AUDOUT: %s\n", ok(testOutputAudio(&node)));
	printf("\tOutputs: %d Audio Outputs: %d Modulators: %d\n",
			node.outputs, node.audio_outputs, node.modulators);
	printf("\n");

	/* Control ioctls */

	printf("Control ioctls:\n");
	printf("\ttest VIDIOC_QUERYCTRL/MENU: %s\n", ok(testQueryControls(&node)));
	printf("\ttest VIDIOC_G/S_CTRL: %s\n", ok(testSimpleControls(&node)));
	printf("\ttest VIDIOC_G/S/TRY_EXT_CTRLS: %s\n", ok(testExtendedControls(&node)));
	printf("\ttest VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: %s\n", ok(testControlEvents(&node)));
	printf("\ttest VIDIOC_G/S_JPEGCOMP: %s\n", ok(testJpegComp(&node)));
	printf("\tStandard Controls: %d Private Controls: %d\n",
			node.std_controls, node.priv_controls);
	printf("\n");

	/* I/O configuration ioctls */

	printf("Input/Output configuration ioctls:\n");
	printf("\ttest VIDIOC_ENUM/G/S/QUERY_STD: %s\n", ok(testStd(&node)));
	printf("\ttest VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: %s\n", ok(testTimings(&node)));
	printf("\ttest VIDIOC_DV_TIMINGS_CAP: %s\n", ok(testTimingsCap(&node)));
	printf("\n");

	/* Format ioctls */

	printf("Format ioctls:\n");
	printf("\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", ok(testEnumFormats(&node)));
	printf("\ttest VIDIOC_G/S_PARM: %s\n", ok(testParm(&node)));
	printf("\ttest VIDIOC_G_FBUF: %s\n", ok(testFBuf(&node)));
	printf("\ttest VIDIOC_G_FMT: %s\n", ok(testGetFormats(&node)));
	printf("\ttest VIDIOC_TRY_FMT: %s\n", ok(testTryFormats(&node)));
	printf("\ttest VIDIOC_S_FMT: %s\n", ok(testSetFormats(&node)));
	printf("\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", ok(testSlicedVBICap(&node)));
	printf("\n");

	/* Codec ioctls */

	printf("Codec ioctls:\n");
	printf("\ttest VIDIOC_(TRY_)ENCODER_CMD: %s\n", ok(testEncoder(&node)));
	printf("\ttest VIDIOC_G_ENC_INDEX: %s\n", ok(testEncIndex(&node)));
	printf("\ttest VIDIOC_(TRY_)DECODER_CMD: %s\n", ok(testDecoder(&node)));
	printf("\n");

	/* Buffer ioctls */

	printf("Buffer ioctls:\n");
	printf("\ttest VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: %s\n", ok(testReqBufs(&node)));
	//printf("\ttest read/write: %s\n", ok(testReadWrite(&node)));
	printf("\n");

	/* TODO:

	   VIDIOC_CROPCAP, VIDIOC_G/S_CROP, VIDIOC_G/S_SELECTION
	   VIDIOC_S_FBUF/OVERLAY
	   VIDIOC_QBUF/DQBUF/QUERYBUF/PREPARE_BUFS/EXPBUF
	   VIDIOC_STREAMON/OFF
	   */

	/* Final test report */

	test_close(node.fd);
	if (node.node2)
		test_close(node.node2->fd);
	printf("Total: %d, Succeeded: %d, Failed: %d, Warnings: %d\n",
			tests_total, tests_ok, tests_total - tests_ok, warnings);
	exit(app_result);
}