linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Minimal libv4l2 support for complex cameras
@ 2020-03-23 11:47 Pavel Machek
  2020-03-23 11:57 ` Laurent Pinchart
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2020-03-23 11:47 UTC (permalink / raw)
  To: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	laurent.pinchart, linux-media

[-- Attachment #1: Type: text/plain, Size: 84156 bytes --]

Hi!

We now have easy-to-install support for complex camera in form of
Maemo Leste on N900.... Unfortunately we don't have anything in
userspace that can be used to work with the camera.

This attempts to be minimal solution to get libv4l2 to work.

It enables passing camera pipeline description to libv4l2, so that
controls are mapped to appopriate devices, and libv4l2 can be used
with complex camera.

It is useful for testing kernel parts of N900 subsystem, and it will
serve as a basis for autofocus work and autogain improvements.

Signed-off-by: Pavel Machek <pavel@ucw.cz>

diff --git a/lib/include/libv4l2.h b/lib/include/libv4l2.h
index ea1870db0..a0ec0a91e 100644
--- a/lib/include/libv4l2.h
+++ b/lib/include/libv4l2.h
@@ -58,6 +58,10 @@ LIBV4L_PUBLIC extern FILE *v4l2_log_file;
    invalid memory address will not lead to failure with errno being EFAULT,
    as it would with a real ioctl, but will cause libv4l2 to break, and you
    get to keep both pieces.
+
+   You can open complex pipelines by passing ".cv" file with pipeline
+   description to v4l2_open(). libv4l2 will open all the required
+   devices automatically in that case.
 */
 
 LIBV4L_PUBLIC int v4l2_open(const char *file, int oflag, ...);
diff --git a/lib/libv4l2/libv4l2-priv.h b/lib/libv4l2/libv4l2-priv.h
index 1924c91f6..1ee697a62 100644
--- a/lib/libv4l2/libv4l2-priv.h
+++ b/lib/libv4l2/libv4l2-priv.h
@@ -104,6 +104,7 @@ struct v4l2_dev_info {
 	void *plugin_library;
 	void *dev_ops_priv;
 	const struct libv4l_dev_ops *dev_ops;
+	struct v4l2_controls_map *map;
 };
 
 /* From v4l2-plugin.c */
@@ -130,4 +131,20 @@ static inline void v4l2_plugin_cleanup(void *plugin_lib, void *plugin_priv,
 extern const char *v4l2_ioctls[];
 void v4l2_log_ioctl(unsigned long int request, void *arg, int result);
 
+
+struct v4l2_control_map {
+	unsigned long control;
+	int fd;
+};
+
+struct v4l2_controls_map {
+	int main_fd;
+	int num_fds;
+	int num_controls;
+	struct v4l2_control_map map[];
+};
+
+int v4l2_open_pipeline(struct v4l2_controls_map *map, int v4l2_flags);
+LIBV4L_PUBLIC int v4l2_get_fd_for_control(int fd, unsigned long control);
+
 #endif
diff --git a/lib/libv4l2/libv4l2.c b/lib/libv4l2/libv4l2.c
index 9ebf8c18e..268a5101d 100644
--- a/lib/libv4l2/libv4l2.c
+++ b/lib/libv4l2/libv4l2.c
@@ -70,6 +70,8 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <dirent.h>
+
 #include "libv4l2.h"
 #include "libv4l2-priv.h"
 #include "libv4l-plugin.h"
@@ -618,6 +620,8 @@ static void v4l2_update_fps(int index, struct v4l2_streamparm *parm)
 		devices[index].fps = 0;
 }
 
+static int v4l2_open_complex(int fd, int v4l2_flags);
+
 int v4l2_open(const char *file, int oflag, ...)
 {
 	int fd;
@@ -641,6 +645,20 @@ int v4l2_open(const char *file, int oflag, ...)
 	if (fd == -1)
 		return fd;
 
+	int len = strlen(file);
+	char *end = ".cv";
+	int len2 = strlen(end);
+	if ((len > len2) && (!strcmp(file + len - len2, end))) {
+		/* .cv extension */
+		struct stat sb;
+
+		if (fstat(fd, &sb) == 0) {
+			if ((sb.st_mode & S_IFMT) == S_IFREG) {
+				return v4l2_open_complex(fd, 0);
+			}
+		}
+	}
+
 	if (v4l2_fd_open(fd, 0) == -1) {
 		int saved_err = errno;
 
@@ -787,6 +805,8 @@ no_capture:
 	if (index >= devices_used)
 		devices_used = index + 1;
 
+	devices[index].map = NULL;
+
 	/* Note we always tell v4lconvert to optimize src fmt selection for
 	   our default fps, the only exception is the app explicitly selecting
 	   a frame rate using the S_PARM ioctl after a S_FMT */
@@ -1056,12 +1076,47 @@ static int v4l2_s_fmt(int index, struct v4l2_format *dest_fmt)
 	return 0;
 }
 
+int v4l2_get_fd_for_control(int fd, unsigned long control)
+{
+	int index = v4l2_get_index(fd);
+	struct v4l2_controls_map *map;
+	int lo = 0;
+	int hi;
+
+	if (index < 0)
+		return fd;
+
+	map = devices[index].map;
+	if (!map)
+		return fd;
+	hi = map->num_controls;
+
+	while (lo < hi) {
+		int i = (lo + hi) / 2;
+		if (map->map[i].control == control) {
+			return map->map[i].fd;
+		}
+		if (map->map[i].control > control) {
+			hi = i;
+			continue;
+		}
+		if (map->map[i].control < control) {
+			lo = i+1;
+			continue;
+		}
+		printf("Bad: impossible condition in binary search\n");
+		exit(1);
+	}
+	return fd;
+}
+
 int v4l2_ioctl(int fd, unsigned long int request, ...)
 {
 	void *arg;
 	va_list ap;
 	int result, index, saved_err;
-	int is_capture_request = 0, stream_needs_locking = 0;
+	int is_capture_request = 0, stream_needs_locking = 0,
+	    is_subdev_request = 0;
 
 	va_start(ap, request);
 	arg = va_arg(ap, void *);
@@ -1081,13 +1136,14 @@ int v4l2_ioctl(int fd, unsigned long int request, ...)
 
 	/* Is this a capture request and do we need to take the stream lock? */
 	switch (request) {
-	case VIDIOC_QUERYCAP:
 	case VIDIOC_QUERYCTRL:
 	case VIDIOC_G_CTRL:
 	case VIDIOC_S_CTRL:
 	case VIDIOC_G_EXT_CTRLS:
-	case VIDIOC_TRY_EXT_CTRLS:
 	case VIDIOC_S_EXT_CTRLS:
+		is_subdev_request = 1;
+	case VIDIOC_QUERYCAP:
+	case VIDIOC_TRY_EXT_CTRLS:
 	case VIDIOC_ENUM_FRAMESIZES:
 	case VIDIOC_ENUM_FRAMEINTERVALS:
 		is_capture_request = 1;
@@ -1151,10 +1207,15 @@ int v4l2_ioctl(int fd, unsigned long int request, ...)
 	}
 
 	if (!is_capture_request) {
+		int sub_fd;
 no_capture_request:
+		sub_fd = fd;
+		if (is_subdev_request) {
+			sub_fd = v4l2_get_fd_for_control(index, ((struct v4l2_queryctrl *) arg)->id);
+		}
 		result = devices[index].dev_ops->ioctl(
 				devices[index].dev_ops_priv,
-				fd, request, arg);
+				sub_fd, request, arg);
 		saved_err = errno;
 		v4l2_log_ioctl(request, arg, result);
 		errno = saved_err;
@@ -1782,3 +1843,193 @@ int v4l2_get_control(int fd, int cid)
 			(qctrl.maximum - qctrl.minimum) / 2) /
 		(qctrl.maximum - qctrl.minimum);
 }
+
+int v4l2_open_pipeline(struct v4l2_controls_map *map, int v4l2_flags)
+{
+	int index;
+	int i;
+
+	for (i=0; i<map->num_controls; i++) {
+		if (map->map[i].fd <= 0) {
+			V4L2_LOG_ERR("v4l2_open_pipeline: Bad fd in map.\n");
+			return -1;
+		}
+		if (i>=1 && map->map[i].control <= map->map[i-1].control) {
+			V4L2_LOG_ERR("v4l2_open_pipeline: Controls not sorted.\n");
+			return -1;
+		}
+	}
+
+	i = v4l2_fd_open(map->main_fd, v4l2_flags);
+	index = v4l2_get_index(map->main_fd);
+	devices[index].map = map;
+	return i;
+}
+
+static void scan_devices(char **device_names, int *device_fds, int num)
+{
+	struct dirent **namelist;
+	int n;
+	char *class_v4l = "/sys/class/video4linux";
+
+	n = scandir(class_v4l, &namelist, NULL, alphasort);
+	if (n < 0) {
+		perror("scandir");
+		return;
+	}
+
+	while (n--) {
+		if (namelist[n]->d_name[0] != '.') {
+			char filename[1024], content[1024];
+			sprintf(filename, "%s/%s/name", class_v4l, namelist[n]->d_name);
+			FILE *f = fopen(filename, "r");
+			if (!f) {
+				printf("Strange, can't open %s", filename);
+			} else {
+				fgets(content, 1024, f);
+				fclose(f);
+
+				int i;
+				for (i = num-1; i >=0; i--) {
+					if (!strcmp(content, device_names[i])) {
+						sprintf(filename, "/dev/%s", namelist[n]->d_name);
+						device_fds[i] = open(filename, O_RDWR);
+						if (device_fds[i] < 0) {
+							V4L2_LOG_ERR("Error opening %s: %m\n", filename);
+						}
+					}
+				}
+			}
+		}
+		free(namelist[n]);
+	}
+	free(namelist);
+  
+}
+
+static int v4l2_open_complex(int fd, int v4l2_flags)
+{
+#define perr(s) V4L2_LOG_ERR("open_complex: " s "\n")
+#define BUF 256
+	FILE *f = fdopen(fd, "r");
+
+	int res = -1;
+	char buf[BUF];
+	int version, num_modes, num_devices, num_controls;
+	int dev, control;
+
+	if (!f) {
+		perr("open of .cv file failed: %m");
+		goto err;
+	}
+
+	if (fscanf(f, "Complex Video: %d\n", &version) != 1) {
+		perr(".cv file does not have required header");
+		goto close;
+	}
+
+	if (version != 0) {
+		perr(".cv file has unknown version");
+		goto close;
+	}
+
+	if (fscanf(f, "#modes: %d\n", &num_modes) != 1) {
+		perr("could not parse modes");
+		goto close;
+	}
+
+	if (num_modes != 1) {
+		perr("only single mode is supported for now");
+		goto close;
+	}
+
+	if (fscanf(f, "Mode: %s\n", buf) != 1) {
+		perr("could not parse mode name");
+		goto close;
+	}
+
+	if (fscanf(f, " #devices: %d\n", &num_devices) != 1) {
+		perr("could not parse number of devices");
+		goto close;
+	}
+#define MAX_DEVICES 16
+	char *device_names[MAX_DEVICES] = { NULL, };
+	int device_fds[MAX_DEVICES];
+	if (num_devices > MAX_DEVICES) {
+		perr("too many devices");
+		goto close;
+	}
+
+	for (dev = 0; dev < num_devices; dev++) {
+		int tmp;
+		if (fscanf(f, "%d: ", &tmp) != 1) {
+			perr("could not parse device");
+			goto free_devices;
+		}
+		if (tmp != dev) {
+			perr("bad device number");
+			goto free_devices;
+		}
+		fgets(buf, BUF, f);
+		device_names[dev] = strdup(buf);
+		device_fds[dev] = -1;
+	}
+
+	scan_devices(device_names, device_fds, num_devices);
+
+	for (dev = 0; dev < num_devices; dev++) {
+		if (device_fds[dev] == -1) {
+			perr("Could not open all required devices");
+			goto close_devices;
+		}
+	}
+
+	if (fscanf(f, " #controls: %d\n", &num_controls) != 1) {
+		perr("can not parse number of controls");
+		goto close_devices;
+	}
+
+	struct v4l2_controls_map *map = malloc(sizeof(struct v4l2_controls_map) +
+					       num_controls*sizeof(struct v4l2_control_map));
+
+	map->num_controls = num_controls;
+	map->num_fds = num_devices;
+	map->main_fd = device_fds[0];
+
+	for (control = 0; control < num_controls; control++) {
+		unsigned long num;
+		int dev;
+		if (fscanf(f, "0x%lx: %d\n", &num, &dev) != 2) {
+			perr("could not parse control");
+			goto free_map;
+		}
+		if ((dev < 0) || (dev >= num_devices)) {
+			perr("device out of range");
+			goto free_map;
+		}
+		map->map[control].control = num;
+		map->map[control].fd = device_fds[dev];
+	}
+	if (fscanf(f, "%s", buf) > 0) {
+		perr("junk at end of file");
+		goto free_map;
+	}
+
+	res = v4l2_open_pipeline(map, v4l2_flags);
+
+	if (res < 0) {
+free_map:
+		free(map);
+close_devices:
+		for (dev = 0; dev < num_devices; dev++)
+			close(device_fds[dev]);
+	}
+free_devices:
+	for (dev = 0; dev < num_devices; dev++) {
+		free(device_names[dev]);
+	}
+close:
+	fclose(f);
+err:
+	return res;
+}
diff --git a/lib/libv4lconvert/control/libv4lcontrol.c b/lib/libv4lconvert/control/libv4lcontrol.c
index 0b0a346e4..8d2516126 100644
--- a/lib/libv4lconvert/control/libv4lcontrol.c
+++ b/lib/libv4lconvert/control/libv4lcontrol.c
@@ -865,6 +865,7 @@ int v4lcontrol_vidioc_queryctrl(struct v4lcontrol_data *data, void *arg)
 	struct v4l2_queryctrl *ctrl = arg;
 	int retval;
 	uint32_t orig_id = ctrl->id;
+	int fd;
 
 	/* if we have an exact match return it */
 	for (i = 0; i < V4LCONTROL_COUNT; i++)
@@ -874,8 +875,9 @@ int v4lcontrol_vidioc_queryctrl(struct v4lcontrol_data *data, void *arg)
 			return 0;
 		}
 
+	fd = v4l2_get_fd_for_control(data->fd, ctrl->id);
 	/* find out what the kernel driver would respond. */
-	retval = data->dev_ops->ioctl(data->dev_ops_priv, data->fd,
+	retval = data->dev_ops->ioctl(data->dev_ops_priv, fd,
 			VIDIOC_QUERYCTRL, arg);
 
 	if ((data->priv_flags & V4LCONTROL_SUPPORTS_NEXT_CTRL) &&
@@ -905,6 +907,7 @@ int v4lcontrol_vidioc_g_ctrl(struct v4lcontrol_data *data, void *arg)
 {
 	int i;
 	struct v4l2_control *ctrl = arg;
+	int fd;
 
 	for (i = 0; i < V4LCONTROL_COUNT; i++)
 		if ((data->controls & (1 << i)) &&
@@ -913,7 +916,8 @@ int v4lcontrol_vidioc_g_ctrl(struct v4lcontrol_data *data, void *arg)
 			return 0;
 		}
 
-	return data->dev_ops->ioctl(data->dev_ops_priv, data->fd,
+	fd = v4l2_get_fd_for_control(data->fd, ctrl->id);
+	return data->dev_ops->ioctl(data->dev_ops_priv, fd,
 			VIDIOC_G_CTRL, arg);
 }
 
@@ -996,6 +1000,7 @@ int v4lcontrol_vidioc_s_ctrl(struct v4lcontrol_data *data, void *arg)
 {
 	int i;
 	struct v4l2_control *ctrl = arg;
+	int fd;
 
 	for (i = 0; i < V4LCONTROL_COUNT; i++)
 		if ((data->controls & (1 << i)) &&
@@ -1010,7 +1015,8 @@ int v4lcontrol_vidioc_s_ctrl(struct v4lcontrol_data *data, void *arg)
 			return 0;
 		}
 
-	return data->dev_ops->ioctl(data->dev_ops_priv, data->fd,
+	fd = v4l2_get_fd_for_control(data->fd, ctrl->id);
+	return data->dev_ops->ioctl(data->dev_ops_priv, fd,
 			VIDIOC_S_CTRL, arg);
 }
 
diff --git a/v4l-utils-po/de.po b/v4l-utils-po/de.po
index 764393af2..2c576ffc6 100644
--- a/v4l-utils-po/de.po
+++ b/v4l-utils-po/de.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: v4l-utils 1.18.0-1\n"
 "Report-Msgid-Bugs-To: linux-media@vger.Kernel.org\n"
-"POT-Creation-Date: 2019-09-22 12:03+0200\n"
+"POT-Creation-Date: 2018-09-21 15:56-0300\n"
 "PO-Revision-Date: 2019-11-23 18:34+0200\n"
 "Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
 "Language-Team: German <debian-l10n-german@lists.debian.org>\n"
@@ -18,25 +18,22 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: utils/keytable/keytable.c:239
 # rc = radio control, Funkfernbedienung
+#: utils/keytable/keytable.c:225
+#, fuzzy
 msgid ""
 "\n"
-"Lists Remote Controller devices, loads rc keymaps, tests events, and "
-"adjusts\n"
-"other Remote Controller options. Rather than loading a rc keymap, it is "
-"also\n"
-"possible to set protocol decoders and set rc scancode to keycode mappings\n"
-"directly.\n"
+"Allows get/set IR keycode/scancode tables\n"
 "You need to have read permissions on /dev/input for the program to work\n"
 "\n"
 "On the options below, the arguments are:\n"
-"  SYSDEV    - the rc device as found at /sys/class/rc\n"
-"  KEYMAP    - a keymap file with protocols and scancode to keycode mappings\n"
+"  DEV       - the /dev/input/event* device to control\n"
+"  SYSDEV    - the ir class as found at /sys/class/rc\n"
+"  TABLE     - a file with a set of scancode=keycode value pairs\n"
 "  SCANKEY   - a set of scancode1=keycode1,scancode2=keycode2.. value pairs\n"
 "  PROTOCOL  - protocol name (nec, rc-5, rc-6, jvc, sony, sanyo, rc-5-sz, "
 "lirc,\n"
-"              sharp, mce_kbd, xmp, imon, rc-mm, other, all) to be enabled,\n"
+"              sharp, mce_kbd, xmp, imon, other, all) to be enabled,\n"
 "              or a bpf protocol name or file\n"
 "  DELAY     - Delay before repeating a keystroke\n"
 "  PERIOD    - Period to repeat a keystroke\n"
@@ -52,9 +49,11 @@ msgstr ""
 "testet\n"
 "Ereignisse und passt andere Fernbedienungsoptionen an. Anstatt eine\n"
 "Funkfernbedienungsschlüsselcodetabellen zu laden, ist es auch möglich,\n"
-"Protokolldekodierer zu setzen und Zuordnungen von Scancodes zu Schlüsselcodes\n"
+"Protokolldekodierer zu setzen und Zuordnungen von Scancodes zu "
+"Schlüsselcodes\n"
 "direkt zu setzen.\n"
-"Damit das Programm funktioniert, müssen Sie Leserechte für /dev/input haben.\n"
+"Damit das Programm funktioniert, müssen Sie Leserechte für /dev/input "
+"haben.\n"
 "\n"
 "Die Argumente für die Optionen unten sind:\n"
 "  SYSDEV    - die Fernbedienungsklasse, wie unter /sys/class/rc beschrieben\n"
@@ -65,66 +64,83 @@ msgstr ""
 "              Scancode1=Schlüsselcode1,Scancode2=Schlüsselcode2 …\n"
 "  PROTOCOL  - Protokollname (nec, rc-5, rc-6, jvc, sony, sanyo, rc-5-sz, "
 "lirc,\n"
-"              sharp, mce_kbd, xmp, imon, rc-mm, andere, alle), der aktiviert\n"
+"              sharp, mce_kbd, xmp, imon, rc-mm, andere, alle), der "
+"aktiviert\n"
 "              werden soll oder ein BPF-Protokollname oder eine Datei\n"
 "  DELAY     - Verzögerung vor dem Wiederholen eines Tastendrucks\n"
 "  PERIOD    - Zeitspanne, um einen Tastendruck zu wiederholen\n"
-"  PARAMETER - ein Satz von Name1=Zahl1,[Name2=Zahl2] … für das BPF-Protokoll\n"
+"  PARAMETER - ein Satz von Name1=Zahl1,[Name2=Zahl2] … für das BPF-"
+"Protokoll\n"
 "  CFGFILE   - Konfigurationsdatei, die einen Treiber-/Tabellennamen mit "
 "einer\n"
 "              Schlüsselcodeabbildungsdatei verbindet\n"
 "\n"
 "Optionen können miteinander kombiniert werden."
 
-#: utils/keytable/keytable.c:260 utils/dvb/dvb-fe-tool.c:56
+#: utils/keytable/keytable.c:243 utils/dvb/dvb-fe-tool.c:56
 msgid "enables debug messages"
 msgstr "aktiviert Meldungen zur Fehlersuche."
 
-#: utils/keytable/keytable.c:261
-msgid "Clears the scancode to keycode mappings"
-msgstr "leert die die Abbildungen der Scancodes auf Schlüsselcodes."
+#: utils/keytable/keytable.c:244
+#, fuzzy
+msgid "clears the old table"
+msgstr "wertet die anderen NIT-/SDT-Tabellen aus"
 
-#: utils/keytable/keytable.c:262
+#: utils/keytable/keytable.c:245
 msgid "SYSDEV"
 msgstr "SYSDEV"
 
-#: utils/keytable/keytable.c:262
-msgid "rc device to control, defaults to rc0 if not specified"
-msgstr ""
-"zu steuernde Fernbedienung, Voreinstellung ist rc@, falls nicht angegeben"
+# LIRC = Linux Infrared Remote Control
+#: utils/keytable/keytable.c:245
+#, fuzzy
+msgid "ir class device to control"
+msgstr "zu verwendende Linux-Infrarotfernbedienung"
 
-#: utils/keytable/keytable.c:263
+#: utils/keytable/keytable.c:246
 msgid "test if IR is generating events"
 msgstr "prüft, ob die Infrarotfernbedienung Ereignisse erzeugt."
 
-#: utils/keytable/keytable.c:264
-msgid "reads the current scancode/keycode mapping"
+#: utils/keytable/keytable.c:247 utils/ir-ctl/ir-ctl.c:103
+msgid "DEV"
+msgstr "DEV"
+
+# LIRC = Linux Infrared Remote Control
+#: utils/keytable/keytable.c:247
+#, fuzzy
+msgid "ir device to control"
+msgstr "zu verwendende Linux-Infrarotfernbedienung"
+
+#: utils/keytable/keytable.c:248
+#, fuzzy
+msgid "reads the current scancode/keycode table"
 msgstr "liest die aktuelle Abbildung der Scancodes auf Schlüsselcode."
 
-#: utils/keytable/keytable.c:265 utils/keytable/keytable.c:272
-#: utils/ir-ctl/ir-ctl.c:127
-msgid "KEYMAP"
-msgstr "KEYMAP"
+#: utils/keytable/keytable.c:249
+msgid "TABLE"
+msgstr ""
 
-#: utils/keytable/keytable.c:265
-msgid "write (adds) the keymap from the specified file"
+#: utils/keytable/keytable.c:249
+#, fuzzy
+msgid ""
+"write (adds) the scancodes to the device scancode/keycode table from an "
+"specified file"
 msgstr ""
 "schreibt die Schlüsselcodetabelle aus der angegebenen Datei (oder fügt sie "
 "hinzu)."
 
-#: utils/keytable/keytable.c:266
+#: utils/keytable/keytable.c:250
 msgid "SCANKEY"
 msgstr "SCANKEY"
 
-#: utils/keytable/keytable.c:266
+#: utils/keytable/keytable.c:250
 msgid "Change scan/key pairs"
 msgstr "ändert Scan-/Schlüsselpaare."
 
-#: utils/keytable/keytable.c:267
+#: utils/keytable/keytable.c:251
 msgid "PROTOCOL"
 msgstr "PROTOCOL"
 
-#: utils/keytable/keytable.c:267
+#: utils/keytable/keytable.c:251
 msgid ""
 "Protocol to enable (the other ones will be disabled). To enable more than "
 "one, use the option more than one time"
@@ -132,168 +148,232 @@ msgstr ""
 "Protokoll, das aktiviert werden soll (die anderen werden deaktiviert). Um "
 "mehr als eins zu aktivieren, benutzen Sie die Option mehrfach."
 
-#: utils/keytable/keytable.c:268
+#: utils/keytable/keytable.c:252
 msgid "PARAMETER"
 msgstr "PARAMETER"
 
-#: utils/keytable/keytable.c:268
+#: utils/keytable/keytable.c:252
 msgid "Set a parameter for the protocol decoder"
 msgstr "setzt einen Parameter für den Protokolldekodierer."
 
-#: utils/keytable/keytable.c:269
+#: utils/keytable/keytable.c:253
 msgid "DELAY"
 msgstr "DELAY"
 
-#: utils/keytable/keytable.c:269
+#: utils/keytable/keytable.c:253
 msgid "Sets the delay before repeating a keystroke"
 msgstr "setzt die Verzögerung, bevor ein Tastendruck wiederholt wird."
 
-#: utils/keytable/keytable.c:270
+#: utils/keytable/keytable.c:254
 msgid "PERIOD"
 msgstr "PERIOD"
 
-#: utils/keytable/keytable.c:270
+#: utils/keytable/keytable.c:254
 msgid "Sets the period to repeat a keystroke"
 msgstr "setzt eine Zeitspanne zum Wiederholen eines Tastendrucks."
 
-#: utils/keytable/keytable.c:271
+#: utils/keytable/keytable.c:255
 msgid "CFGFILE"
 msgstr "CFGFILE"
 
-#: utils/keytable/keytable.c:271
+#: utils/keytable/keytable.c:255
+#, fuzzy
 msgid ""
-"Auto-load keymaps, based on a configuration file. Only works with --sysdev."
+"Auto-load a table, based on a configuration file. Only works with sysdev."
 msgstr ""
 "lädt automatisch eine Schlüsselcodeabbildung basierend auf einer "
 "Konfigurationsdatei. Dies funktioniert nur mit --sysdev."
 
-#: utils/keytable/keytable.c:272
-msgid "Test if keymap is valid"
-msgstr "Testet, ob die Schlüsselcodeabbildung gültig ist."
-
-#: utils/keytable/keytable.c:273 utils/dvb/dvb-fe-tool.c:70
+#: utils/keytable/keytable.c:256 utils/dvb/dvb-fe-tool.c:70
 #: utils/dvb/dvb-format-convert.c:62 utils/dvb/dvbv5-scan.c:93
 #: utils/dvb/dvbv5-zap.c:134
 msgid "Give this help list"
 msgstr "gibt diese Hilfeliste aus."
 
-#: utils/keytable/keytable.c:274 utils/dvb/dvb-fe-tool.c:71
+#: utils/keytable/keytable.c:257 utils/dvb/dvb-fe-tool.c:71
 #: utils/dvb/dvb-format-convert.c:63 utils/dvb/dvbv5-scan.c:94
 #: utils/dvb/dvbv5-zap.c:135
 msgid "Give a short usage message"
 msgstr "gibt eine kurze Benutzungsnachricht aus."
 
-#: utils/keytable/keytable.c:275 utils/dvb/dvb-fe-tool.c:72
+#: utils/keytable/keytable.c:258 utils/dvb/dvb-fe-tool.c:72
 #: utils/dvb/dvb-format-convert.c:64 utils/dvb/dvbv5-scan.c:95
 #: utils/dvb/dvbv5-zap.c:136
 msgid "Print program version"
 msgstr "gibt die Programmversion aus."
 
-#: utils/keytable/keytable.c:398 utils/keytable/keytable.c:424
+#: utils/keytable/keytable.c:263
+msgid ""
+"--device [/dev/input/event* device]\n"
+"--sysdev [ir class (f. ex. rc0)]\n"
+"[for using the rc0 sysdev]"
+msgstr ""
+
+#: utils/keytable/keytable.c:380
+#, fuzzy, c-format
+msgid "Parsing %s keycode file as plain text\n"
+msgstr "Konfigurationsdatei %s wird ausgewertet\n"
+
+#: utils/keytable/keytable.c:415
+#, fuzzy, c-format
+msgid "Protocol %s invalid\n"
+msgstr "Protokoll %s ist %s\n"
+
+#: utils/keytable/keytable.c:446 utils/keytable/keytable.c:541
+#, c-format
+msgid "parsing %s=%s:"
+msgstr ""
+
+#: utils/keytable/keytable.c:449 utils/keytable/keytable.c:545
 #, c-format
 msgid "\tvalue=%d\n"
 msgstr "\tWert=%d\n"
 
-#: utils/keytable/keytable.c:403
+#: utils/keytable/keytable.c:454
+#, fuzzy
+msgid "value"
+msgstr "\tWert=%d\n"
+
+#: utils/keytable/keytable.c:473 utils/keytable/keytable.c:699
 #, c-format
-msgid "%s: keycode `%s' not recognised, no mapping for scancode %d\n"
+msgid "Invalid parameter on line %d of %s\n"
+msgstr "ungültiger Parameter in Zeile %d von %s\n"
+
+#: utils/keytable/keytable.c:488
+#, fuzzy, c-format
+msgid "protocol missing\n"
+msgstr "Protokoll %s ist %s\n"
+
+#: utils/keytable/keytable.c:493
+#, c-format
+msgid "Bad value `%s' for protocol\n"
 msgstr ""
-"%s: Schlüsselcode »%s« nicht erkannt, keine Abbildung für Scancode %d\n"
 
-#: utils/keytable/keytable.c:429
+#: utils/keytable/keytable.c:514
 #, c-format
-msgid "%s: keycode `%s' not recognised, no mapping\n"
-msgstr "%s: Schlüsselcode »%s« nicht erkannt, keine Abbildung\n"
+msgid "No [protocols.scancodes] section\n"
+msgstr ""
+
+#: utils/keytable/keytable.c:530
+#, fuzzy, c-format
+msgid "Invalid value `%s'\n"
+msgstr "ungültige Einschaltdauer »%s«"
+
+#: utils/keytable/keytable.c:535
+#, c-format
+msgid "Bad value `%s' for keycode\n"
+msgstr ""
+
+#: utils/keytable/keytable.c:550
+#, fuzzy, c-format
+msgid "keycode `%s' not recognised, no mapping for scancode %s\n"
+msgstr ""
+"%s: Schlüsselcode »%s« nicht erkannt, keine Abbildung für Scancode %d\n"
+
+#: utils/keytable/keytable.c:580
+#, fuzzy, c-format
+msgid "Parsing %s keycode file as toml\n"
+msgstr "Konfigurationsdatei %s wird ausgewertet\n"
+
+#: utils/keytable/keytable.c:589
+#, fuzzy, c-format
+msgid "Failed to parse toml: %s\n"
+msgstr "Lesen von Tabellendatei %s fehlgeschlagen"
+
+#: utils/keytable/keytable.c:595
+#, fuzzy, c-format
+msgid "Missing [protocols] section\n"
+msgstr "%s-Protokoll %s\n"
+
+#: utils/keytable/keytable.c:612
+#, fuzzy, c-format
+msgid "No protocols found\n"
+msgstr "Fehler: Protokoll »%s« nicht gefunden\n"
 
-#: utils/keytable/keytable.c:462
+#: utils/keytable/keytable.c:644
 #, c-format
 msgid "Parsing %s config file\n"
 msgstr "Konfigurationsdatei %s wird ausgewertet\n"
 
-#: utils/keytable/keytable.c:466
+#: utils/keytable/keytable.c:648
 msgid "opening keycode file"
 msgstr "Schlüsselcodedatei wird geöffnet"
 
-#: utils/keytable/keytable.c:493
+#: utils/keytable/keytable.c:675
 #, c-format
 msgid "Driver %s, Table %s => file %s\n"
 msgstr "Treiber %s, Tabelle %s => Datei %s\n"
 
-#: utils/keytable/keytable.c:517
-#, c-format
-msgid "Invalid parameter on line %d of %s\n"
-msgstr "ungültiger Parameter in Zeile %d von %s\n"
-
-#: utils/keytable/keytable.c:542
+#: utils/keytable/keytable.c:724
 #, c-format
 msgid "Invalid delay: %s"
 msgstr "ungültige Verzögerung: »%s«"
 
-#: utils/keytable/keytable.c:547
+#: utils/keytable/keytable.c:729
 #, c-format
 msgid "Invalid period: %s"
 msgstr "ungültige Zeitspanne: %s"
 
-#: utils/keytable/keytable.c:560 utils/keytable/keytable.c:695
+#: utils/keytable/keytable.c:745
 #, c-format
 msgid "Failed to read table file %s"
 msgstr "Lesen von Tabellendatei %s fehlgeschlagen"
 
-#: utils/keytable/keytable.c:564
+#: utils/keytable/keytable.c:747
 #, c-format
 msgid "Read %s table\n"
 msgstr "Lesen von Tabelle %s\n"
 
-#: utils/keytable/keytable.c:573
+#: utils/keytable/keytable.c:753
 #, c-format
 msgid "Failed to read config file %s"
 msgstr "Lesen der Konfigurationsdatei %s fehlgeschlagen"
 
-#: utils/keytable/keytable.c:582
+#: utils/keytable/keytable.c:762
 #, c-format
 msgid "Missing scancode: %s"
 msgstr "fehlender Scancode: %s"
 
-#: utils/keytable/keytable.c:588 utils/keytable/keytable.c:659
+#: utils/keytable/keytable.c:768 utils/keytable/keytable.c:839
 msgid "No memory!\n"
 msgstr "Kein Speicher!\n"
 
-#: utils/keytable/keytable.c:595
+#: utils/keytable/keytable.c:775
 #, c-format
 msgid "Invalid scancode: %s"
 msgstr "ungültiger Scancode: »%s«"
 
-#: utils/keytable/keytable.c:602
+#: utils/keytable/keytable.c:782
 msgid "Missing keycode"
 msgstr "fehlender Schlüsselcode"
 
-#: utils/keytable/keytable.c:611 utils/keytable/keytable.c:675
+#: utils/keytable/keytable.c:791 utils/keytable/keytable.c:855
 #, c-format
 msgid "Unknown keycode: %s"
 msgstr "unbekannter Schlüsselcode: %s"
 
-#: utils/keytable/keytable.c:619
+#: utils/keytable/keytable.c:799
 #, c-format
 msgid "scancode 0x%04x=%u\n"
 msgstr "Scancode 0x%04x=%u\n"
 
-#: utils/keytable/keytable.c:653
+#: utils/keytable/keytable.c:833
 #, c-format
 msgid "Missing parameter name: %s"
 msgstr "fehlender Parametername: %s"
 
-#: utils/keytable/keytable.c:668
+#: utils/keytable/keytable.c:848
 msgid "Missing value"
 msgstr "fehlender Wert"
 
-#: utils/keytable/keytable.c:680
-#, c-format
-msgid "parameter %s=%ld\n"
+#: utils/keytable/keytable.c:860
+#, fuzzy, c-format
+msgid "parameter %s=%d\n"
 msgstr "Parameter %s=%ld\n"
 
-#: utils/keytable/keytable.c:703 utils/dvb/dvb-fe-tool.c:160
+#: utils/keytable/keytable.c:874 utils/dvb/dvb-fe-tool.c:160
 #: utils/dvb/dvb-format-convert.c:88 utils/dvb/dvbv5-scan.c:421
-#: utils/dvb/dvbv5-zap.c:715
+#: utils/dvb/dvbv5-zap.c:714
 #, c-format
 msgid ""
 "\n"
@@ -302,568 +382,544 @@ msgstr ""
 "\n"
 "Melden Sie Fehler an %s.\n"
 
-#: utils/keytable/keytable.c:731
+#: utils/keytable/keytable.c:902
 #, c-format
 msgid "scancode 0x%04x = %s (0x%02x)\n"
 msgstr "Scancode 0x%04x = %s (0x%02x)\n"
 
-#: utils/keytable/keytable.c:737
+#: utils/keytable/keytable.c:908
 #, c-format
 msgid "scancode 0x%04x = '%c' (0x%02x)\n"
 msgstr "Scancode 0x%04x = »%c« (0x%02x)\n"
 
-#: utils/keytable/keytable.c:739
+#: utils/keytable/keytable.c:910
 #, c-format
 msgid "scancode 0x%04x = 0x%02x\n"
 msgstr "Scancode 0x%04x = 0x%02x\n"
 
-#: utils/keytable/keytable.c:790 utils/keytable/keytable.c:1218
+#: utils/keytable/keytable.c:961 utils/keytable/keytable.c:1368
 #, c-format
 msgid "Couldn't find any node at %s%s*.\n"
 msgstr "Bei %s%s* konnte kein Knoten gefunden werden.\n"
 
-#: utils/keytable/keytable.c:799
+#: utils/keytable/keytable.c:970
 msgid "Seek dir"
 msgstr "Suchverzeichnis"
 
-#: utils/keytable/keytable.c:831
+#: utils/keytable/keytable.c:1002
 #, c-format
 msgid "Parsing uevent %s\n"
 msgstr "Uevent %s wird ausgewertet.\n"
 
-#: utils/keytable/keytable.c:855
+#: utils/keytable/keytable.c:1026
 #, c-format
 msgid "Error on uevent information\n"
 msgstr "Fehler bei Uevent-Information\n"
 
-#: utils/keytable/keytable.c:871
+#: utils/keytable/keytable.c:1042
 #, c-format
 msgid "%s uevent %s=%s\n"
 msgstr "%s Uevent %s=%s\n"
 
-#: utils/keytable/keytable.c:900
+#: utils/keytable/keytable.c:1071
 #, c-format
 msgid "No devices found\n"
 msgstr "keine Geräte gefunden\n"
 
-#: utils/keytable/keytable.c:906
+#: utils/keytable/keytable.c:1077
 #, c-format
 msgid "Found device %s\n"
 msgstr "Gerät %s gefunden\n"
 
-#: utils/keytable/keytable.c:930
+#: utils/keytable/keytable.c:1101
 #, c-format
 msgid "Not found device %s\n"
 msgstr "Gerät %s nicht gefunden\n"
 
-#: utils/keytable/keytable.c:986
+#: utils/keytable/keytable.c:1136
 #, c-format
 msgid "%s protocol %s\n"
 msgstr "%s-Protokoll %s\n"
 
-#: utils/keytable/keytable.c:1051
+#: utils/keytable/keytable.c:1201
 #, c-format
 msgid "%s has invalid content: '%s'\n"
 msgstr "%s hat ungültigen Inhalt: »%s«\n"
 
-#: utils/keytable/keytable.c:1058
+#: utils/keytable/keytable.c:1208
 #, c-format
 msgid "protocol %s is %s\n"
 msgstr "Protokoll %s ist %s\n"
 
-#: utils/keytable/keytable.c:1059 utils/keytable/keytable.c:1126
+#: utils/keytable/keytable.c:1209 utils/keytable/keytable.c:1276
 msgid "enabled"
 msgstr "aktiviert"
 
-#: utils/keytable/keytable.c:1059 utils/keytable/keytable.c:1126
+#: utils/keytable/keytable.c:1209 utils/keytable/keytable.c:1276
 msgid "disabled"
 msgstr "deaktiviert"
 
-#: utils/keytable/keytable.c:1125
+#: utils/keytable/keytable.c:1275
 #, c-format
 msgid "%s protocol %s (%s)\n"
 msgstr "%s-Protokoll %s (%s)\n"
 
-#: utils/keytable/keytable.c:1153
+#: utils/keytable/keytable.c:1303
 #, c-format
 msgid "Protocols for device can not be changed\n"
 msgstr "Protokolle für das Gerät können nicht geändert werden.\n"
 
-#: utils/keytable/keytable.c:1210
+#: utils/keytable/keytable.c:1360
 #, c-format
 msgid "Found more than one input interface. This is currently unsupported\n"
 msgstr ""
 "Es wurde mehr als eine Eingabeschnittstelle gefunden. Dies wird derzeit "
 "nicht unterstützt.\n"
 
-#: utils/keytable/keytable.c:1214
+#: utils/keytable/keytable.c:1364
 #, c-format
 msgid "Input sysfs node is %s\n"
 msgstr "Eingabe-Sysfs-Knoten ist %s\n"
 
-#: utils/keytable/keytable.c:1226
+#: utils/keytable/keytable.c:1376
 #, c-format
 msgid "Found more than one event interface. This is currently unsupported\n"
 msgstr ""
 "Es wurde mehr als eine Ereignisschnittstelle gefunden. Dies wird derzeit "
 "nicht unterstützt.\n"
 
-#: utils/keytable/keytable.c:1230
+#: utils/keytable/keytable.c:1380
 #, c-format
 msgid "Event sysfs node is %s\n"
 msgstr "Ereignis-Sysfs-Knoten ist %s\n"
 
-#: utils/keytable/keytable.c:1249
+#: utils/keytable/keytable.c:1399
 #, c-format
 msgid "Input device name not found.\n"
 msgstr "Eingabegerätename nicht gefunden\n"
 
-#: utils/keytable/keytable.c:1274
+#: utils/keytable/keytable.c:1424
 #, c-format
 msgid "input device is %s\n"
 msgstr "Eingabegerät ist %s\n"
 
-#: utils/keytable/keytable.c:1352
+#: utils/keytable/keytable.c:1502
 #, c-format
 msgid "Unable to query evdev protocol version: %s\n"
 msgstr "Edev-Protokollversion kann nicht abgefragt werden: %s\n"
 
-#: utils/keytable/keytable.c:1357
+#: utils/keytable/keytable.c:1507
 #, c-format
 msgid "Input Protocol version: 0x%08x\n"
 msgstr "Eingabeprotokollversion: 0x%08x\n"
 
-#: utils/keytable/keytable.c:1388
+#: utils/keytable/keytable.c:1538
 #, c-format
 msgid "Deleting entry %d\n"
 msgstr "Eintrag %d wird gelöscht.\n"
 
-#: utils/keytable/keytable.c:1410
+#: utils/keytable/keytable.c:1560
 #, c-format
 msgid "Setting scancode 0x%04x with 0x%04x via "
 msgstr "Scancode 0x%04x mit 0x%04x wird gesetzt über "
 
-#: utils/keytable/keytable.c:1428
+#: utils/keytable/keytable.c:1578
 #, c-format
 msgid "Current kernel protocols: "
 msgstr "Aktuelle Kernelprotokolle: "
 
-#: utils/keytable/keytable.c:1430
+#: utils/keytable/keytable.c:1580
 #, c-format
 msgid "Enabled kernel protocols: "
 msgstr "Aktivierte Kernelprotokolle: "
 
-#: utils/keytable/keytable.c:1454
+#: utils/keytable/keytable.c:1604
 #, c-format
 msgid "%llu.%06llu: "
 msgstr "%llu.%06llu: "
 
-#: utils/keytable/keytable.c:1459
+#: utils/keytable/keytable.c:1609
 #, c-format
 msgid "lirc protocol(%s): scancode = 0x%llx"
 msgstr "Linux-Infrarotfernbedienungsprotokoll(%s): Scancode = 0x%llx"
 
-#: utils/keytable/keytable.c:1462
+#: utils/keytable/keytable.c:1612
 #, c-format
 msgid "lirc protocol(%d): scancode = 0x%llx"
 msgstr "Linux-Infrarotfernbedienungsprotokoll(%d): Scancode = 0x%llx"
 
-#: utils/keytable/keytable.c:1466
+#: utils/keytable/keytable.c:1616
 #, c-format
 msgid " repeat"
 msgstr " wiederholen"
 
-#: utils/keytable/keytable.c:1468
+#: utils/keytable/keytable.c:1618
 #, c-format
 msgid " toggle=1"
 msgstr " umschalten=1"
 
-#: utils/keytable/keytable.c:1489
+#: utils/keytable/keytable.c:1639
 msgid "Can't open lirc device"
 msgstr "Linux-Infrarotfernbedienungsgerät kann nicht geöffnet werden"
 
-#: utils/keytable/keytable.c:1499
+#: utils/keytable/keytable.c:1649
 #, c-format
 msgid "Testing events. Please, press CTRL-C to abort.\n"
 msgstr ""
 "Ereignisse werden getestet. Bitte drücken Sie STRG-C, um abzubrechen.\n"
 
-#: utils/keytable/keytable.c:1510
+#: utils/keytable/keytable.c:1660
 msgid "poll returned error"
 msgstr "Abfrage gab Fehler zurück"
 
-#: utils/keytable/keytable.c:1519
+#: utils/keytable/keytable.c:1669
 msgid "Error reading lirc scancode"
 msgstr "Fehler beim Lesen des Linux-Infrarotfernbedienungs-Scancodes"
 
-#: utils/keytable/keytable.c:1530
+#: utils/keytable/keytable.c:1680
 msgid "Error reading event"
 msgstr "Fehler beim Lesen des Ereignisses"
 
-#: utils/keytable/keytable.c:1535
+#: utils/keytable/keytable.c:1685
 #, c-format
 msgid "%ld.%06ld: event type %s(0x%02x)"
 msgstr "%ld.%06ld: Ereignistyp %s(0x%02x)"
 
-#: utils/keytable/keytable.c:1544
+#: utils/keytable/keytable.c:1694
 #, c-format
 msgid " key_%s: %s(0x%04x)\n"
 msgstr " key_%s: %s(0x%04x)\n"
 
-#: utils/keytable/keytable.c:1545
+#: utils/keytable/keytable.c:1695
 msgid "up"
 msgstr "hoch"
 
-#: utils/keytable/keytable.c:1545
+#: utils/keytable/keytable.c:1695
 msgid "down"
 msgstr "runter"
 
-#: utils/keytable/keytable.c:1550 utils/keytable/keytable.c:1556
+#: utils/keytable/keytable.c:1700 utils/keytable/keytable.c:1706
 #, c-format
 msgid ": %s (0x%04x) value=%d\n"
 msgstr ": %s (0x%04x) Wert=%d\n"
 
-#: utils/keytable/keytable.c:1563
+#: utils/keytable/keytable.c:1713
 #, c-format
 msgid ": scancode = 0x%02x\n"
 msgstr ": Scancode = 0x%02x\n"
 
-#: utils/keytable/keytable.c:1565
+#: utils/keytable/keytable.c:1715
 #, c-format
 msgid ": code = %s(0x%02x), value = %d\n"
 msgstr ": Code = %s(0x%02x), Wert = %d\n"
 
-#: utils/keytable/keytable.c:1570
+#: utils/keytable/keytable.c:1720
 #, c-format
 msgid ": value = %d\n"
 msgstr ": Wert = %d\n"
 
-#: utils/keytable/keytable.c:1579
+#: utils/keytable/keytable.c:1729
 #, c-format
 msgid ": code = 0x%02x, value = %d\n"
 msgstr ": Code = 0x%02x, Wert = %d\n"
 
-#: utils/keytable/keytable.c:1648
+#: utils/keytable/keytable.c:1798
 #, c-format
 msgid "Changed Repeat delay to %d ms and repeat period to %d ms\n"
 msgstr ""
 "Wiederholungsverzögerung auf %d ms und Wiederholungsdauer auf %d ms "
 "geändert\n"
 
-#: utils/keytable/keytable.c:1662
+#: utils/keytable/keytable.c:1812
 #, c-format
 msgid "Repeat delay = %d ms, repeat period = %d ms\n"
 msgstr "Wiederholungsverzögerung = %d ms, Wiederholungsperiode = %d ms\n"
 
-#: utils/keytable/keytable.c:1681
+#: utils/keytable/keytable.c:1831
 #, c-format
 msgid "%sName: %.*s\n"
 msgstr "%sName: %.*s\n"
 
-#: utils/keytable/keytable.c:1694
+#: utils/keytable/keytable.c:1844
 #, c-format
 msgid "%sbus: %d, vendor/product: %04x:%04x, version: 0x%04x\n"
 msgstr "%sbus: %d, Anbieter/Produkt: %04x:%04x, Version: 0x%04x\n"
 
-#: utils/keytable/keytable.c:1725
+#: utils/keytable/keytable.c:1870
 #, c-format
 msgid "%s: not a raw IR receiver\n"
 msgstr "%s: kein Empfangsgerät für unverarbeitetes Infrarot\n"
 
-#: utils/keytable/keytable.c:1773
+#: utils/keytable/keytable.c:1908
 #, c-format
 msgid "\tAttached BPF protocols: "
 msgstr "\tangefügte BPF-Protokolle: "
 
-#: utils/keytable/keytable.c:1791
+#: utils/keytable/keytable.c:1926
 #, c-format
 msgid "\n"
 msgstr "\n"
 
-#: utils/keytable/keytable.c:1794
+#: utils/keytable/keytable.c:1929
 #, c-format
 msgid "\tAttached BPF protocols: %m\n"
 msgstr "\ttangefügte BPF-Protokolle: %m\n"
 
-#: utils/keytable/keytable.c:1829
+#: utils/keytable/keytable.c:1964
 #, c-format
 msgid "BPF protocol prog_id %d\n"
 msgstr "BPF-Protokoll prog_id %d\n"
 
-#: utils/keytable/keytable.c:1833
+#: utils/keytable/keytable.c:1968
 #, c-format
 msgid "Failed to get BPF prog id %u: %m\n"
 msgstr "Holen der BPF-Programmkennung %u fehlgeschlagen: %m\n"
 
-#: utils/keytable/keytable.c:1845
+#: utils/keytable/keytable.c:1980
 #, c-format
 msgid "BPF protocols removed\n"
 msgstr "BPF-Protokolle entfernt\n"
 
-#: utils/keytable/keytable.c:1850
+#: utils/keytable/keytable.c:1985
 #, c-format
 msgid "error: ir-keytable was compiled without BPF support\n"
 msgstr ""
 "Fehler: Infrarot-Schlüsselcodetabelle wurde ohne BPF-Unterstützung "
 "kompiliert\n"
 
-#: utils/keytable/keytable.c:1869
-#, c-format
-msgid "Found %s with:\n"
+#: utils/keytable/keytable.c:2003
+#, fuzzy, c-format
+msgid "Found %s (%s) with:\n"
 msgstr "%s gefunden mit:\n"
 
-#: utils/keytable/keytable.c:1872
+#: utils/keytable/keytable.c:2007
 #, c-format
 msgid "\tName: %s\n"
 msgstr "\tName: %s\n"
 
-#: utils/keytable/keytable.c:1874
-#, c-format
-msgid "\tDriver: %s\n"
-msgstr "\tTreiber %s\n"
-
-#: utils/keytable/keytable.c:1876
-#, c-format
-msgid "\tDefault keymap: %s\n"
-msgstr "\tStandardschlüsselcodeabbildung: %s\n"
-
-#: utils/keytable/keytable.c:1878
-#, c-format
-msgid "\tInput device: %s\n"
-msgstr "\tEingabegerät: %s\n"
+#: utils/keytable/keytable.c:2009
+#, fuzzy, c-format
+msgid "\tDriver: %s, table: %s\n"
+msgstr "Treiber %s, Tabelle %s => Datei %s\n"
 
-#: utils/keytable/keytable.c:1881
+#: utils/keytable/keytable.c:2013
 #, c-format
 msgid "\tLIRC device: %s\n"
 msgstr "\tLinux-Infrarotfernbedienung : %s\n"
 
-#: utils/keytable/keytable.c:1885
+#: utils/keytable/keytable.c:2017
 #, c-format
 msgid "\tSupported kernel protocols: "
 msgstr "\tunterstützte Kernelprotokolle: "
 
-#: utils/keytable/keytable.c:1897
+#: utils/keytable/keytable.c:2029
 #, c-format
 msgid "\tExtra capabilities: <access denied>\n"
 msgstr "\tzusätzliche Fähigkeiten: <Zugriff verweigert>\n"
 
-#: utils/keytable/keytable.c:1913 utils/keytable/keytable.c:1920
+#: utils/keytable/keytable.c:2045 utils/keytable/keytable.c:2052
 #, c-format
 msgid "asprintf failed: %m\n"
 msgstr "asprintf fehlgeschlagen: %m\n"
 
-#: utils/keytable/keytable.c:1925
+#: utils/keytable/keytable.c:2057
 #, c-format
 msgid "Can't find %s bpf protocol in %s or %s\n"
 msgstr "BPF-Protokoll %s konnte weder in %s noch in %s gefunden werden.\n"
 
-#: utils/keytable/keytable.c:1987
-#, c-format
-msgid ""
-"Auto-mode can be used only with --read, --verbose and --sysdev options\n"
+#: utils/keytable/keytable.c:2101
+#, fuzzy
+msgid "Can't open device"
+msgstr "Linux-Infrarotfernbedienungsgerät kann nicht geöffnet werden"
+
+#: utils/keytable/keytable.c:2119
+#, fuzzy, c-format
+msgid "Auto-mode can be used only with --read, --debug and --sysdev options\n"
 msgstr ""
 "Automatischer Modus kann nur mit den Optionen --read, --verbose und --sysdev "
 "benutzt werden.\n"
 
+#: utils/keytable/keytable.c:2153
+#, c-format
+msgid "Table for %s, %s not found. Keep as-is\n"
+msgstr "Tabelle für %s, %s nicht gefunden. Istzustand beibehalten\n"
+
 # Treibername, Schlüsseltabellenname, Dateiname
-#: utils/keytable/keytable.c:2017
+#: utils/keytable/keytable.c:2158
 #, c-format
 msgid "Table for %s, %s is on %s file.\n"
 msgstr "Tabelle für %s, %s ist in der Datei %s.\n"
 
-#: utils/keytable/keytable.c:2026
+#: utils/keytable/keytable.c:2165
 #, c-format
 msgid "Can't load %s table\n"
 msgstr "Tabelle %s kann nicht geladen werden.\n"
 
-#: utils/keytable/keytable.c:2046
+#: utils/keytable/keytable.c:2182
 #, c-format
 msgid "Can't load %s table from %s or %s\n"
 msgstr "Tabelle %s kann nicht von %s oder %s geladen werden.\n"
 
-#: utils/keytable/keytable.c:2054
+#: utils/keytable/keytable.c:2187
 #, c-format
 msgid "Empty table %s\n"
 msgstr "leere Tabelle %s\n"
 
-#: utils/keytable/keytable.c:2063
-#, c-format
-msgid "Table for %s, %s not found. Keep as-is\n"
-msgstr "Tabelle für %s, %s nicht gefunden. Istzustand beibehalten\n"
-
-#: utils/keytable/keytable.c:2070
+#: utils/keytable/keytable.c:2194
 #, c-format
 msgid "Opening %s\n"
 msgstr "%s wird geöffnet.\n"
 
-#: utils/keytable/keytable.c:2086
+#: utils/keytable/keytable.c:2210
 #, c-format
 msgid "Old keytable cleared\n"
 msgstr "alte Schlüsseltabelle geleert\n"
 
-#: utils/keytable/keytable.c:2094
+#: utils/keytable/keytable.c:2218
 #, c-format
 msgid "Wrote %d keycode(s) to driver\n"
 msgstr "%d Schlüsselcode(s) wurden in den Treiber geschrieben.\n"
 
-#: utils/keytable/keytable.c:2106
+#: utils/keytable/keytable.c:2229
 #, c-format
 msgid "Couldn't change the IR protocols\n"
 msgstr "Die Fernbedienungsprotokolle konnten nicht geändert werden\n"
 
-#: utils/keytable/keytable.c:2108
+#: utils/keytable/keytable.c:2231
 #, c-format
 msgid "Protocols changed to "
 msgstr "Protokolle geändert in "
 
-#: utils/keytable/keytable.c:2118
+#: utils/keytable/keytable.c:2241
 #, c-format
 msgid "Error: unable to attach bpf program, lirc device name was not found\n"
 msgstr ""
-"Fehler: BPF-Programm kann nicht angefügt werden, Name der "
-"Linux-Infrarotfernbedienung wurde nicht gefunden\n"
+"Fehler: BPF-Programm kann nicht angefügt werden, Name der Linux-"
+"Infrarotfernbedienung wurde nicht gefunden\n"
 
-#: utils/keytable/keytable.c:2126
+#: utils/keytable/keytable.c:2249
 #, c-format
 msgid "Loaded BPF protocol %s\n"
 msgstr "geladenes BPF-Protokoll %s\n"
 
-#: utils/ir-ctl/ir-ctl.c:110
-msgid "DEV"
-msgstr "DEV"
-
 # LIRC = Linux Infrared Remote Control
-#: utils/ir-ctl/ir-ctl.c:110
+#: utils/ir-ctl/ir-ctl.c:103
 msgid "lirc device to use"
 msgstr "zu verwendende Linux-Infrarotfernbedienung"
 
-#: utils/ir-ctl/ir-ctl.c:111
+#: utils/ir-ctl/ir-ctl.c:104
 msgid "list lirc device features"
 msgstr "Liste der Linux-Infrarotfernbedienungsfunktionalitäten"
 
-#: utils/ir-ctl/ir-ctl.c:112 utils/ir-ctl/ir-ctl.c:113
+#: utils/ir-ctl/ir-ctl.c:105 utils/ir-ctl/ir-ctl.c:106
 msgid "FILE"
 msgstr "FILE"
 
-#: utils/ir-ctl/ir-ctl.c:112
+#: utils/ir-ctl/ir-ctl.c:105
 msgid "receive IR to stdout or file"
 msgstr "empfängt Infrarot auf Standardausgabe oder Datei"
 
-#: utils/ir-ctl/ir-ctl.c:113
+#: utils/ir-ctl/ir-ctl.c:106
 msgid "send IR pulse and space file"
 msgstr "sendet Fernbedienungsimpuls und Datei mit Leerzeichen"
 
-#: utils/ir-ctl/ir-ctl.c:114
+#: utils/ir-ctl/ir-ctl.c:107
 msgid "SCANCODE"
 msgstr "SCANCODE"
 
-#: utils/ir-ctl/ir-ctl.c:114
+#: utils/ir-ctl/ir-ctl.c:107
 msgid "send IR scancode in protocol specified"
 msgstr "sendet Fernbedienungs-Scancode im angegebenen Protokoll"
 
-#: utils/ir-ctl/ir-ctl.c:115
-msgid "KEYCODE"
-msgstr "SCHLÜSSELCODE"
-
-#: utils/ir-ctl/ir-ctl.c:115
-msgid "send IR keycode from keymap"
-msgstr "sendet Infrarotschlüsselcode aus der Schlüsselcode-Abbildung"
-
-#: utils/ir-ctl/ir-ctl.c:116
+#: utils/ir-ctl/ir-ctl.c:108
 msgid "verbose output"
 msgstr "detaillierte Ausgabe"
 
-#: utils/ir-ctl/ir-ctl.c:117
+#: utils/ir-ctl/ir-ctl.c:109
 msgid "Receiving options:"
 msgstr "Empfangsoptionen:"
 
-#: utils/ir-ctl/ir-ctl.c:118
+#: utils/ir-ctl/ir-ctl.c:110
 msgid "end receiving after first message"
 msgstr "Empfang nach erster Nachricht beenden"
 
-#: utils/ir-ctl/ir-ctl.c:119
-msgid "output in mode2 format"
-msgstr "Ausgabe im Modus-2-Format "
-
-#: utils/ir-ctl/ir-ctl.c:120
+#: utils/ir-ctl/ir-ctl.c:111
 msgid "use wideband receiver aka learning mode"
 msgstr "Breitbandempfänger alias Lernmodus verwenden"
 
-#: utils/ir-ctl/ir-ctl.c:121
-msgid "use narrowband receiver, disable learning mode"
+#: utils/ir-ctl/ir-ctl.c:112
+#, fuzzy
+msgid "use normal narrowband receiver, disable learning mode"
 msgstr "normalen Schmalbandempfänger verwenden, Lernmodus deaktivieren"
 
-#: utils/ir-ctl/ir-ctl.c:122
+#: utils/ir-ctl/ir-ctl.c:113
 msgid "RANGE"
 msgstr "RANGE"
 
-#: utils/ir-ctl/ir-ctl.c:122
+#: utils/ir-ctl/ir-ctl.c:113
 msgid "set receiver carrier range"
 msgstr "setzt Trägerbereich des Empfängers"
 
-#: utils/ir-ctl/ir-ctl.c:123
+#: utils/ir-ctl/ir-ctl.c:114
 msgid "report carrier frequency"
 msgstr "berichtet die Trägerfrequenz"
 
-#: utils/ir-ctl/ir-ctl.c:124
+#: utils/ir-ctl/ir-ctl.c:115
 msgid "disable reporting carrier frequency"
 msgstr "deaktiviert das Berichten der Trägerfrequenz"
 
-#: utils/ir-ctl/ir-ctl.c:125
+#: utils/ir-ctl/ir-ctl.c:116
 msgid "TIMEOUT"
 msgstr "TIMEOUT"
 
-#: utils/ir-ctl/ir-ctl.c:125
+#: utils/ir-ctl/ir-ctl.c:116
 msgid "set receiving timeout"
 msgstr "setzt die Empfangszeitüberschreitung"
 
-#: utils/ir-ctl/ir-ctl.c:126
+#: utils/ir-ctl/ir-ctl.c:117
 msgid "Sending options:"
 msgstr "Sendeoptionen:"
 
-#: utils/ir-ctl/ir-ctl.c:127
-msgid "use keymap to send key from"
-msgstr "Schlüsselcodeabbildung verwenden zum Schlüsselversand von"
-
-#: utils/ir-ctl/ir-ctl.c:128
+#: utils/ir-ctl/ir-ctl.c:118
 msgid "CARRIER"
 msgstr "CARRIER"
 
-#: utils/ir-ctl/ir-ctl.c:128
+#: utils/ir-ctl/ir-ctl.c:118
 msgid "set send carrier"
 msgstr "setzt den Sendeträger"
 
-#: utils/ir-ctl/ir-ctl.c:129
+#: utils/ir-ctl/ir-ctl.c:119
 msgid "DUTY"
 msgstr "DUTY"
 
-#: utils/ir-ctl/ir-ctl.c:129
-msgid "set send duty cycle"
+#: utils/ir-ctl/ir-ctl.c:119
+#, fuzzy
+msgid "set duty cycle"
 msgstr "setzt die Sendebetriebsdauer"
 
-#: utils/ir-ctl/ir-ctl.c:130
+#: utils/ir-ctl/ir-ctl.c:120
 msgid "EMITTERS"
 msgstr "EMITTERS"
 
-#: utils/ir-ctl/ir-ctl.c:130
+#: utils/ir-ctl/ir-ctl.c:120
 msgid "set send emitters"
 msgstr "setzt die Sendeimpulsgeber"
 
-#: utils/ir-ctl/ir-ctl.c:131
+#: utils/ir-ctl/ir-ctl.c:121
 msgid "GAP"
 msgstr "ABSTAND"
 
-#: utils/ir-ctl/ir-ctl.c:131
+#: utils/ir-ctl/ir-ctl.c:121
 msgid "set gap between files or scancodes"
 msgstr "setzt den Abstand zwischen Dateien oder Scancodes."
 
-#: utils/ir-ctl/ir-ctl.c:136
+#: utils/ir-ctl/ir-ctl.c:126
+#, fuzzy
 msgid ""
 "--features\n"
 "--receive [save to file]\n"
 "--send [file to send]\n"
 "--scancode [scancode to send]\n"
-"--keycode [keycode to send]\n"
 "[to set lirc option]"
 msgstr ""
 "--features\n"
@@ -872,24 +928,23 @@ msgstr ""
 "--scancode [Scancode, der gesendet werden soll]\n"
 "[zum Setzen der Linux-Infrarotfernbedienungsoption]"
 
-#: utils/ir-ctl/ir-ctl.c:144
+#: utils/ir-ctl/ir-ctl.c:133
+#, fuzzy
 msgid ""
 "\n"
 "Receive IR, send IR and list features of lirc device\n"
 "You will need permission on /dev/lirc for the program to work\n"
 "\n"
 "On the options below, the arguments are:\n"
-"  DEV      - the /dev/lirc* device to use\n"
+"  DEV\t    - the /dev/lirc* device to use\n"
 "  FILE     - a text file containing pulses and spaces\n"
 "  CARRIER  - the carrier frequency to use for sending\n"
 "  DUTY     - the duty cycle to use for sending\n"
 "  EMITTERS - comma separated list of emitters to use for sending, e.g. 1,2\n"
-"  GAP      - gap between sending in microseconds\n"
+"  GAP      - gap between pulse and files or scancodes in microseconds\n"
 "  RANGE    - set range of accepted carrier frequencies, e.g. 20000-40000\n"
 "  TIMEOUT  - set length of space before receiving stops in microseconds\n"
-"  KEYCODE  - key code in keymap\n"
 "  SCANCODE - protocol:scancode, e.g. nec:0xa814\n"
-"  KEYMAP   - a rc keymap file from which to send keys\n"
 "\n"
 "Note that most lirc setting have global state, i.e. the device will remain\n"
 "in this state until set otherwise."
@@ -921,398 +976,355 @@ msgstr ""
 "bis\n"
 "es anderweitig gesetzt wird."
 
-#: utils/ir-ctl/ir-ctl.c:219 utils/ir-ctl/ir-ctl.c:380
-#: utils/ir-ctl/ir-ctl.c:536
+#: utils/ir-ctl/ir-ctl.c:207
+#, c-format
+msgid "%s: could not open: %m\n"
+msgstr "%s: konnte nicht öffnen: %m\n"
+
+#: utils/ir-ctl/ir-ctl.c:213 utils/ir-ctl/ir-ctl.c:390
 #, c-format
 msgid "Failed to allocate memory\n"
 msgstr "Reservieren von Speicher fehlgeschlagen\n"
 
-#: utils/ir-ctl/ir-ctl.c:238
+#: utils/ir-ctl/ir-ctl.c:231
 #, c-format
 msgid "warning: %s:%d: missing argument\n"
 msgstr "Warnung: %s:%d: fehlendes Argument\n"
 
-#: utils/ir-ctl/ir-ctl.c:254
-#, c-format
+#: utils/ir-ctl/ir-ctl.c:247
+#, fuzzy, c-format
 msgid ""
-"error: %s:%d: scancode argument '%s' should be in protocol:scancode format\n"
+"error: %s:%d: scancode argument '%s' should in protocol:scancode format\n"
 msgstr ""
 "Fehler: %s:%d: Scancode-Argument »%s« sollte das Format Protokoll:Scancode\n"
 "haben.\n"
 
-#: utils/ir-ctl/ir-ctl.c:263
+#: utils/ir-ctl/ir-ctl.c:254
 #, c-format
 msgid "error: %s:%d: protocol '%s' not found\n"
 msgstr "Fehler: %s:%d: Protokoll »%s« nicht gefunden\n"
 
-#: utils/ir-ctl/ir-ctl.c:270
+#: utils/ir-ctl/ir-ctl.c:259
 #, c-format
 msgid "error: %s:%d: invalid scancode '%s'\n"
 msgstr "Fehler: %s:%d: ungültiger Scancode »%s«\n"
 
-#: utils/ir-ctl/ir-ctl.c:277
+#: utils/ir-ctl/ir-ctl.c:264
 #, c-format
 msgid "error: %s:%d: no encoder available for `%s'\n"
 msgstr "Fehler: %s:%d: kein gültiger Kodierer für »%s« verfügbar\n"
 
-#: utils/ir-ctl/ir-ctl.c:286
+#: utils/ir-ctl/ir-ctl.c:269
+#, fuzzy, c-format
+msgid "error: %s:%d: invalid scancode '%s' for protocol '%s'\n"
+msgstr "Fehler: %s:%d: ungültiger Scancode »%s«\n"
+
+#: utils/ir-ctl/ir-ctl.c:274
 #, c-format
 msgid "error: %s:%d: too much IR for one transmit\n"
 msgstr "Fehler: %s:%d: zu viel Infrarot für einen Versendevorgang\n"
 
-#: utils/ir-ctl/ir-ctl.c:294
+#: utils/ir-ctl/ir-ctl.c:280
 #, c-format
 msgid "error: %s:%d: carrier already specified\n"
 msgstr "Fehler: %s:%d: Träger bereits angegeben\n"
 
-#: utils/ir-ctl/ir-ctl.c:305
+#: utils/ir-ctl/ir-ctl.c:291
 #, c-format
 msgid "warning: %s:%d: invalid argument '%s'\n"
 msgstr "Warnung: %s:%d: ungültiges Argument »%s«\n"
 
-#: utils/ir-ctl/ir-ctl.c:311
+#: utils/ir-ctl/ir-ctl.c:297
 #, c-format
 msgid "warning: %s:%d: '%s' unexpected\n"
 msgstr "Warnung: %s:%d: »%s« nicht erwartet\n"
 
-#: utils/ir-ctl/ir-ctl.c:318
+#: utils/ir-ctl/ir-ctl.c:304
 #, c-format
 msgid "warning: %s:%d: leading space ignored\n"
 msgstr "Warnung: %s:%d: führendes Leerzeichen ignoriert\n"
 
-#: utils/ir-ctl/ir-ctl.c:336
+#: utils/ir-ctl/ir-ctl.c:322
 #, c-format
 msgid "warning: %s:%d: carrier already specified\n"
 msgstr "Warnung: %s:%d: Träger bereits angegeben\n"
 
-#: utils/ir-ctl/ir-ctl.c:341
+#: utils/ir-ctl/ir-ctl.c:327
 #, c-format
 msgid "warning: %s:%d: unknown keyword '%s' ignored\n"
 msgstr "Warnung: %s:%d: unbekanntes Schlüsselwort »%s« ignoriert\n"
 
-#: utils/ir-ctl/ir-ctl.c:346 utils/ir-ctl/ir-ctl.c:437
+#: utils/ir-ctl/ir-ctl.c:332
 #, c-format
 msgid "warning: %s:%d: IR cannot exceed %u edges\n"
 msgstr "Warnung: %s:%d: Infrarot kann %u Ränder nicht übersteigen\n"
 
-#: utils/ir-ctl/ir-ctl.c:354 utils/ir-ctl/ir-ctl.c:448
+#: utils/ir-ctl/ir-ctl.c:340
 #, c-format
 msgid "%s: no pulses or spaces found\n"
 msgstr "%s: keine Impulse oder Leerzeichen gefunden\n"
 
-#: utils/ir-ctl/ir-ctl.c:360 utils/ir-ctl/ir-ctl.c:454
+#: utils/ir-ctl/ir-ctl.c:346
 #, c-format
 msgid "warning: %s:%d: trailing space ignored\n"
 msgstr "Warnung: %s:%d: führenden Leerzeichen ignoriert\n"
 
-#: utils/ir-ctl/ir-ctl.c:402
-#, c-format
-msgid "%s:%d: error: expected integer, got `%s'\n"
-msgstr "%s:%d: Fehler: Ganzzahl erwartet, »%s« erhalten\n"
-
-#: utils/ir-ctl/ir-ctl.c:411
-#, c-format
-msgid "%s:%d: error: pulse found where space expected `%s'\n"
-msgstr "%s:%d: Fehler: Impuls gefunden, wo Pause erwartet wurde »%s«\n"
-
-#: utils/ir-ctl/ir-ctl.c:419
-#, c-format
-msgid "%s:%d: error: space found where pulse expected `%s'\n"
-msgstr "%s:%d: Fehler: Pause gefunden, wo Impuls erwartet wurde »%s«\n"
-
-#: utils/ir-ctl/ir-ctl.c:428
-#, c-format
-msgid "%s:%d: error: value `%s' out of range\n"
-msgstr "%s:%d: Fehler: Wert »%s« außerhalb des Bereichs\n"
-
-#: utils/ir-ctl/ir-ctl.c:470
-#, c-format
-msgid "%s: could not open: %m\n"
-msgstr "%s: konnte nicht öffnen: %m\n"
-
-#: utils/ir-ctl/ir-ctl.c:500
-#, c-format
-msgid "%s: file is empty\n"
-msgstr "%s: Datei ist leer\n"
-
-#: utils/ir-ctl/ir-ctl.c:514
+#: utils/ir-ctl/ir-ctl.c:365
 #, c-format
 msgid "error: scancode '%s' must be in protocol:scancode format\n"
 msgstr "Fehler: Scancode »%s« muss das Format Protokoll:Scancode haben\n"
 
-#: utils/ir-ctl/ir-ctl.c:521
+#: utils/ir-ctl/ir-ctl.c:372
 #, c-format
 msgid "error: protocol '%s' not found\n"
 msgstr "Fehler: Protokoll »%s« nicht gefunden\n"
 
-#: utils/ir-ctl/ir-ctl.c:528
+#: utils/ir-ctl/ir-ctl.c:379
 #, c-format
 msgid "error: invalid scancode '%s'\n"
 msgstr "Fehler: ungültiger Scancode »%s«\n"
 
-#: utils/ir-ctl/ir-ctl.c:557
+#: utils/ir-ctl/ir-ctl.c:384
+#, fuzzy, c-format
+msgid "error: invalid scancode '%s' for protocol '%s'\n"
+msgstr "Fehler: ungültiger Scancode »%s«\n"
+
+#: utils/ir-ctl/ir-ctl.c:409
 msgid "features can not be combined with receive or send option"
 msgstr ""
 "Funktionalitäten können nicht mit Empfangs- oder Sendeoptionen kombiniert "
 "werden."
 
-#: utils/ir-ctl/ir-ctl.c:563
+#: utils/ir-ctl/ir-ctl.c:415
 msgid "receive can not be combined with features or send option"
 msgstr ""
 "Empfang kann nicht mit Funktionalitäten oder Sendeoptionen kombiniert werden."
 
-#: utils/ir-ctl/ir-ctl.c:568
+#: utils/ir-ctl/ir-ctl.c:420
 msgid "receive filename already set"
 msgstr "Empfangsdateiname bereits gesetzt"
 
-#: utils/ir-ctl/ir-ctl.c:584 utils/ir-ctl/ir-ctl.c:590
+#: utils/ir-ctl/ir-ctl.c:433 utils/ir-ctl/ir-ctl.c:439
 msgid "cannot enable and disable carrier reports"
 msgstr "Trägerberichte können nicht aktiviert oder deaktiviert werden."
 
-#: utils/ir-ctl/ir-ctl.c:596 utils/ir-ctl/ir-ctl.c:602
+#: utils/ir-ctl/ir-ctl.c:445 utils/ir-ctl/ir-ctl.c:451
 msgid "cannot use narrowband and wideband receiver at once"
 msgstr ""
 "Schmal- und Breitbandempfänger können nicht gleichzeitig benutzt werden."
 
-#: utils/ir-ctl/ir-ctl.c:612 utils/ir-ctl/ir-ctl.c:615
+#: utils/ir-ctl/ir-ctl.c:461 utils/ir-ctl/ir-ctl.c:464
 #, c-format
 msgid "cannot parse carrier range `%s'"
 msgstr "Trägerbereich »%s« kann nicht ausgewertet werden."
 
-#: utils/ir-ctl/ir-ctl.c:624
+#: utils/ir-ctl/ir-ctl.c:473
 #, c-format
 msgid "cannot parse timeout `%s'"
 msgstr "Zeitüberschreitung »%s« kann nicht ausgewertet werden."
 
-#: utils/ir-ctl/ir-ctl.c:634
+#: utils/ir-ctl/ir-ctl.c:483
 #, c-format
 msgid "cannot parse carrier `%s'"
 msgstr "Träger »%s« kann nicht ausgewertet werden."
 
-#: utils/ir-ctl/ir-ctl.c:639
+#: utils/ir-ctl/ir-ctl.c:488
 #, c-format
 msgid "cannot parse emitters `%s'"
 msgstr "Versender »%s« kann nicht ausgewertet werden."
 
-#: utils/ir-ctl/ir-ctl.c:644
+#: utils/ir-ctl/ir-ctl.c:493
 #, c-format
 msgid "cannot parse gap `%s'"
 msgstr "Abstand »%s« kann nicht ausgewertet werden."
 
-#: utils/ir-ctl/ir-ctl.c:649
+#: utils/ir-ctl/ir-ctl.c:498
 #, c-format
 msgid "invalid duty cycle `%s'"
 msgstr "ungültige Einschaltdauer »%s«"
 
-#: utils/ir-ctl/ir-ctl.c:653 utils/ir-ctl/ir-ctl.c:669
+#: utils/ir-ctl/ir-ctl.c:502 utils/ir-ctl/ir-ctl.c:518
 msgid "send can not be combined with receive or features option"
 msgstr ""
-"Senden kann nicht mit Empfangs- oder Funktionalitätenoption kombiniert werden."
-
-#: utils/ir-ctl/ir-ctl.c:686
-msgid "key send can not be combined with receive or features option"
-msgstr ""
-"Senden des Schlüssels kann nicht mit Empfangs- oder Funktionalitätenoption "
-"kombiniert werden."
-
-#: utils/ir-ctl/ir-ctl.c:790
-#, c-format
-msgid "error: protocol '%s' not supported\n"
-msgstr "Fehler: Protokoll »%s« nicht unterstützt\n"
-
-#: utils/ir-ctl/ir-ctl.c:797
-#, c-format
-msgid "error: keycode `%s' not found in keymap\n"
-msgstr "Fehler: Schlüsselcode »%s« nicht in Schlüsselcodeabbildung gefunden\n"
-
-#: utils/ir-ctl/ir-ctl.c:802
-#, c-format
-msgid "warning: keycode `%s' has %d definitions in keymaps, using first\n"
-msgstr ""
-"Warnung: Schlüsselcode »%s« hat %d Definitionen in Schlüsselcodeabbildungen, "
-"die erste wird benutzt.\n"
+"Senden kann nicht mit Empfangs- oder Funktionalitätenoption kombiniert "
+"werden."
 
-#: utils/ir-ctl/ir-ctl.c:820
+#: utils/ir-ctl/ir-ctl.c:561
 #, c-format
 msgid "%s: cannot open: %m\n"
 msgstr "%s: Öffnen nicht möglich: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:827
+#: utils/ir-ctl/ir-ctl.c:568
 #, c-format
 msgid "%s: cannot stat: %m\n"
 msgstr "%s: Stat nicht möglich: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:833
+#: utils/ir-ctl/ir-ctl.c:574
 #, c-format
 msgid "%s: not character device\n"
 msgstr "%s: kein zeichenorientiertes Gerät\n"
 
-#: utils/ir-ctl/ir-ctl.c:840
+#: utils/ir-ctl/ir-ctl.c:581
 #, c-format
 msgid "%s: failed to get lirc features: %m\n"
 msgstr ""
 "%s: Holen von Linux-Infrarotfernbedienungsfunktionalitäten fehlgeschlagen: "
 "%m\n"
 
-#: utils/ir-ctl/ir-ctl.c:853
+#: utils/ir-ctl/ir-ctl.c:594
 #, c-format
 msgid "warning: %s: failed to set carrier: %m\n"
 msgstr "Warnung: %s: Setzen des Trägers fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:855
+#: utils/ir-ctl/ir-ctl.c:596
 #, c-format
 msgid "warning: %s: set send carrier returned %d, should return 0\n"
 msgstr ""
 "Warnung: %s: Setzen des Sendeträgers gab %d zurück, sollte jedoch 0 "
 "zurückgeben.\n"
 
-#: utils/ir-ctl/ir-ctl.c:857
+#: utils/ir-ctl/ir-ctl.c:598
 #, c-format
 msgid "warning: %s: does not support setting send carrier\n"
 msgstr "Warnung: %s: Einstellung des Sendeträgers wird nicht unterstützt.\n"
 
-#: utils/ir-ctl/ir-ctl.c:869
+#: utils/ir-ctl/ir-ctl.c:610
 #, c-format
 msgid "%s: failed to set receiving timeout\n"
 msgstr "%s: Setzen der Empfangszeitüberschreitung fehlgeschlagen\n"
 
-#: utils/ir-ctl/ir-ctl.c:871
+#: utils/ir-ctl/ir-ctl.c:612
 #, c-format
 msgid "%s: device does not support setting timeout\n"
 msgstr "%s: Gerät unterstützt die Einstellung der Zeitüberschreitung nicht.\n"
 
-#: utils/ir-ctl/ir-ctl.c:879
+#: utils/ir-ctl/ir-ctl.c:620
 #, c-format
 msgid "%s: failed to set wideband receiver %s\n"
 msgstr "%s: Setzen des Breitbandempfängers %s fehlgeschlagen\n"
 
-#: utils/ir-ctl/ir-ctl.c:879 utils/ir-ctl/ir-ctl.c:889
+#: utils/ir-ctl/ir-ctl.c:620 utils/ir-ctl/ir-ctl.c:630
 msgid "on"
 msgstr "an"
 
-#: utils/ir-ctl/ir-ctl.c:879 utils/ir-ctl/ir-ctl.c:889
+#: utils/ir-ctl/ir-ctl.c:620 utils/ir-ctl/ir-ctl.c:630
 msgid "off"
 msgstr "aus"
 
-#: utils/ir-ctl/ir-ctl.c:881
+#: utils/ir-ctl/ir-ctl.c:622
 #, c-format
 msgid "%s: device does not have wideband receiver\n"
 msgstr "%s: Gerät hat keinen Breitbandempfänger.\n"
 
 # %s = Gerät, %s = on/off
-#: utils/ir-ctl/ir-ctl.c:889
+#: utils/ir-ctl/ir-ctl.c:630
 #, c-format
 msgid "%s: failed to set carrier reports %s\n"
 msgstr "%s: Setzen von Trägerberichten auf %s fehlgeschlagen\n"
 
-#: utils/ir-ctl/ir-ctl.c:891
+#: utils/ir-ctl/ir-ctl.c:632
 #, c-format
 msgid "%s: device cannot measure carrier\n"
 msgstr "%s: Gerät kann Träger nicht messen.\n"
 
 # %s = Gerät, %s = on/off
-#: utils/ir-ctl/ir-ctl.c:898
+#: utils/ir-ctl/ir-ctl.c:639
 #, c-format
 msgid "%s: failed to enable timeout reports: %m\n"
 msgstr "%s: Aktivieren von Zeitüberschreitungsberichten fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:905
+#: utils/ir-ctl/ir-ctl.c:646
 #, c-format
 msgid "%s: failed to set low carrier range: %m\n"
 msgstr "%s: Setzen des niedrigen Trägerbereichs fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:908
+#: utils/ir-ctl/ir-ctl.c:649
 #, c-format
 msgid "%s: failed to set high carrier range: %m\n"
 msgstr "%s: Setzen des höheren Trägerbereichs fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:910
+#: utils/ir-ctl/ir-ctl.c:651
 #, c-format
 msgid "%s: device does not support setting receiver carrier range\n"
 msgstr ""
 "%s: Gerät unterstützt die Einstellung des Empfangsträgerbereichs nicht.\n"
 
-#: utils/ir-ctl/ir-ctl.c:920
+#: utils/ir-ctl/ir-ctl.c:661
 #, c-format
 msgid "warning: %s: failed to set duty cycle: %m\n"
 msgstr "Warnung: %s: Setzen der Einschaltdauer fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:922
+#: utils/ir-ctl/ir-ctl.c:663
 #, c-format
 msgid "warning: %s: does not support setting send duty cycle\n"
 msgstr "Warnung: %s: Einstellung der Einschaltdauer wird nicht unterstützt.\n"
 
-#: utils/ir-ctl/ir-ctl.c:929
+#: utils/ir-ctl/ir-ctl.c:670
 #, c-format
 msgid "warning: %s: failed to set send transmitters: only %d available\n"
 msgstr "Warnung: %s: Setzen des Senders fehlgeschlagen: nur %d verfügbar\n"
 
-#: utils/ir-ctl/ir-ctl.c:931
+#: utils/ir-ctl/ir-ctl.c:672
 #, c-format
 msgid "warning: %s: failed to set send transmitters: %m\n"
 msgstr "Warnung: %s: Setzen des Senders fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:933
+#: utils/ir-ctl/ir-ctl.c:674
 #, c-format
 msgid "warning: %s: does not support setting send transmitters\n"
 msgstr "Warnung: %s: Einstellung des Senders wird nicht unterstützt.\n"
 
-#: utils/ir-ctl/ir-ctl.c:949
+#: utils/ir-ctl/ir-ctl.c:690
 #, c-format
 msgid "warning: %s: device returned resolution of 0\n"
 msgstr "Warnung: %s: Gerät lieferte Auflösung von 0 zurück\n"
 
-#: utils/ir-ctl/ir-ctl.c:951
+#: utils/ir-ctl/ir-ctl.c:692
 #, c-format
 msgid "warning: %s: unexpected error while retrieving resolution: %m\n"
 msgstr "Warnung: %s: unerwarteter Fehler beim Abfragen der Auflösung: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:954
+#: utils/ir-ctl/ir-ctl.c:695
 #, c-format
 msgid "Receive features %s:\n"
 msgstr "Empfangsfunktionalitäten %s:\n"
 
-#: utils/ir-ctl/ir-ctl.c:956
+#: utils/ir-ctl/ir-ctl.c:697
 #, c-format
 msgid " - Device can receive scancodes\n"
 msgstr " - Gerät kann Scancodes empfangen.\n"
 
-#: utils/ir-ctl/ir-ctl.c:958
+#: utils/ir-ctl/ir-ctl.c:699
 #, c-format
 msgid " - Device can receive raw IR\n"
 msgstr " - Gerät kann unverarbeitetes Infrarot empfangen.\n"
 
-#: utils/ir-ctl/ir-ctl.c:960
+#: utils/ir-ctl/ir-ctl.c:701
 #, c-format
 msgid " - Can report decoded scancodes and protocol\n"
 msgstr " - kann dekodierte Scancodes und Protokolle berichten\n"
 
-#: utils/ir-ctl/ir-ctl.c:962
+#: utils/ir-ctl/ir-ctl.c:703
 #, c-format
 msgid " - Resolution %u microseconds\n"
 msgstr " - Auflösung %u Mikrosekunden\n"
 
-#: utils/ir-ctl/ir-ctl.c:964
+#: utils/ir-ctl/ir-ctl.c:705
 #, c-format
 msgid " - Set receive carrier\n"
 msgstr " - Empfangsträger setzen\n"
 
-#: utils/ir-ctl/ir-ctl.c:966
+#: utils/ir-ctl/ir-ctl.c:707
 #, c-format
 msgid " - Use wideband receiver\n"
 msgstr " - Breitbandempfänger verwenden\n"
 
-#: utils/ir-ctl/ir-ctl.c:968
+#: utils/ir-ctl/ir-ctl.c:709
 #, c-format
 msgid " - Can measure carrier\n"
 msgstr " - Träger kann gemessen werden.\n"
 
-#: utils/ir-ctl/ir-ctl.c:975
-#, c-format
-msgid " - Receiving timeout %u microseconds\n"
-msgstr " - Empfangszeitüberschreitung %u Mikrosekunden\n"
-
-#: utils/ir-ctl/ir-ctl.c:978
+#: utils/ir-ctl/ir-ctl.c:714
 #, c-format
 msgid ""
 "warning: %s: device supports setting receiving timeout but "
@@ -1321,7 +1333,7 @@ msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung zum Empfangen der "
 "Zeitüberschreitungen, LIRC_GET_MIN_TIMEOUT gibt jedoch folgendes zurück: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:981
+#: utils/ir-ctl/ir-ctl.c:717
 #, c-format
 msgid ""
 "warning: %s: device supports setting receiving timeout but min timeout is 0\n"
@@ -1329,7 +1341,7 @@ msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung zum Empfangen der "
 "Zeitüberschreitungen, die minimale Zeitüberschreitung ist jedoch 0\n"
 
-#: utils/ir-ctl/ir-ctl.c:984
+#: utils/ir-ctl/ir-ctl.c:720
 #, c-format
 msgid ""
 "warning: %s: device supports setting receiving timeout but "
@@ -1338,7 +1350,7 @@ msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung zum Empfangen der "
 "Zeitüberschreitungen, LIRC_GET_MAX_TIMEOUT gibt jedoch folgendes zurück: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:987
+#: utils/ir-ctl/ir-ctl.c:723
 #, c-format
 msgid ""
 "warning: %s: device supports setting receiving timeout but max timeout is 0\n"
@@ -1346,14 +1358,14 @@ msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung zum Empfangen der "
 "Zeitüberschreitungen, die maximale Zeitüberschreitung ist jedoch 0\n"
 
-#: utils/ir-ctl/ir-ctl.c:991
-#, c-format
-msgid " - Can set receiving timeout min %u microseconds, max %u microseconds\n"
+#: utils/ir-ctl/ir-ctl.c:727
+#, fuzzy, c-format
+msgid " - Can set receiving timeout min:%u microseconds max:%u microseconds\n"
 msgstr ""
 " - Empfangszeitüberschreitung kann auf minimal %u Millisekunden und maximal "
 "%u Mikrosekunden gesetzt werden\n"
 
-#: utils/ir-ctl/ir-ctl.c:994
+#: utils/ir-ctl/ir-ctl.c:730
 #, c-format
 msgid ""
 " - Device can receive using device dependent LIRCCODE mode (not supported)\n"
@@ -1361,37 +1373,37 @@ msgstr ""
 " - Gerät kann mittels eines geräteabhängigen LIRCCODE-Modus empfangen (nicht "
 "unterstützt)\n"
 
-#: utils/ir-ctl/ir-ctl.c:996
+#: utils/ir-ctl/ir-ctl.c:732
 #, c-format
 msgid " - Device cannot receive\n"
 msgstr " - Gerät nicht empfangsbereit\n"
 
-#: utils/ir-ctl/ir-ctl.c:999
+#: utils/ir-ctl/ir-ctl.c:735
 #, c-format
 msgid "Send features %s:\n"
 msgstr "Sendefunktionalitäten %s:\n"
 
-#: utils/ir-ctl/ir-ctl.c:1001
+#: utils/ir-ctl/ir-ctl.c:737
 #, c-format
 msgid " - Device can send raw IR\n"
 msgstr " - Gerät kann unverarbeitetes Infrarot senden\n"
 
-#: utils/ir-ctl/ir-ctl.c:1003
+#: utils/ir-ctl/ir-ctl.c:739
 #, c-format
 msgid " - IR scancode encoder\n"
 msgstr " - Infrarot-Scancode-Kodierer\n"
 
-#: utils/ir-ctl/ir-ctl.c:1005
+#: utils/ir-ctl/ir-ctl.c:741
 #, c-format
 msgid " - Set carrier\n"
 msgstr " - Träger setzen\n"
 
-#: utils/ir-ctl/ir-ctl.c:1007
+#: utils/ir-ctl/ir-ctl.c:743
 #, c-format
 msgid " - Set duty cycle\n"
 msgstr " - Einschaltdauer setzen\n"
 
-#: utils/ir-ctl/ir-ctl.c:1012
+#: utils/ir-ctl/ir-ctl.c:748
 #, c-format
 msgid ""
 "warning: %s: device supports setting transmitter mask but returns 0 as "
@@ -1400,19 +1412,19 @@ msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung der Sendermaske, gibt jedoch "
 "als Anzahl der Sender 0 zurück\n"
 
-#: utils/ir-ctl/ir-ctl.c:1014
+#: utils/ir-ctl/ir-ctl.c:750
 #, c-format
 msgid "warning: %s: device supports setting transmitter mask but returns: %m\n"
 msgstr ""
 "Warnung: %s: Gerät unterstützt die Einstellung der Sendermaske, gibt jedoch "
 "folgendes zurück: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:1016
+#: utils/ir-ctl/ir-ctl.c:752
 #, c-format
 msgid " - Set transmitter (%d available)\n"
 msgstr " - Sender setzen (%d verfügbar)\n"
 
-#: utils/ir-ctl/ir-ctl.c:1019
+#: utils/ir-ctl/ir-ctl.c:755
 #, c-format
 msgid ""
 " - Device can send using device dependent LIRCCODE mode (not supported)\n"
@@ -1420,72 +1432,67 @@ msgstr ""
 " - Gerät kann mittels eines geräteabhängigen LIRCCODE-Modus senden (nicht "
 "unterstützt)\n"
 
-#: utils/ir-ctl/ir-ctl.c:1021
+#: utils/ir-ctl/ir-ctl.c:757
 #, c-format
 msgid " - Device cannot send\n"
 msgstr " - Gerät kann nicht senden.\n"
 
-#: utils/ir-ctl/ir-ctl.c:1032
+#: utils/ir-ctl/ir-ctl.c:768
 #, c-format
 msgid "%s: device cannot send\n"
 msgstr "%s: Gerät kann nicht senden.\n"
 
-#: utils/ir-ctl/ir-ctl.c:1058
+#: utils/ir-ctl/ir-ctl.c:790
 #, c-format
 msgid "%s: cannot set send mode\n"
 msgstr "%s: Sendemodus kann nicht gesetzt werden\n"
 
-#: utils/ir-ctl/ir-ctl.c:1066
+#: utils/ir-ctl/ir-ctl.c:798
 #, c-format
 msgid "%s: no encoder available for `%s'\n"
 msgstr "%s: kein Kodierer für »%s« verfügbar\n"
 
-#: utils/ir-ctl/ir-ctl.c:1075
+#: utils/ir-ctl/ir-ctl.c:807
 #, c-format
 msgid "warning: %s: carrier specified but overwritten on command line\n"
 msgstr ""
 "Warnung: %s: Träger angegeben, jedoch auf der Befehlszeile überschrieben\n"
 
-#: utils/ir-ctl/ir-ctl.c:1089
+#: utils/ir-ctl/ir-ctl.c:820
 #, c-format
 msgid "%s: failed to send: %m\n"
 msgstr "%s: Senden fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:1094
+#: utils/ir-ctl/ir-ctl.c:825
 #, c-format
 msgid "warning: %s: sent %zd out %zd edges\n"
 msgstr "Warnung: %s: %zd von %zd Rändern gesendet\n"
 
-#: utils/ir-ctl/ir-ctl.c:1114
+#: utils/ir-ctl/ir-ctl.c:845
 #, c-format
 msgid "%s: device cannot receive raw ir\n"
 msgstr "%s Gerät kann kein unbearbeitetes Infrarot empfangen.\n"
 
-#: utils/ir-ctl/ir-ctl.c:1120
+#: utils/ir-ctl/ir-ctl.c:851
 #, c-format
 msgid "%s: failed to set receive mode: %m\n"
 msgstr "%s: Setzen des Empfangsmodus fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:1127
+#: utils/ir-ctl/ir-ctl.c:858
 #, c-format
 msgid "%s: failed to open for writing: %m\n"
 msgstr "%s: Öffnen zum Schreiben fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:1140
+#: utils/ir-ctl/ir-ctl.c:870
 #, c-format
 msgid "%s: failed read: %m\n"
 msgstr "%s: Lesen fehlgeschlagen: %m\n"
 
-#: utils/ir-ctl/ir-ctl.c:1145
+#: utils/ir-ctl/ir-ctl.c:875
 #, c-format
 msgid "%s: read returned %zd bytes\n"
 msgstr "%s: Lesen gab %zd Byte zurück\n"
 
-#: utils/ir-ctl/ir-ctl.c:1255
-#, c-format
-msgid "error: no keymap specified\n"
-msgstr "Fehler: keine Schlüsselcodeabbildung angegeben\n"
-
 # DVB = Digital Video Broadcasting („Digitales Fernsehen“)
 #: utils/dvb/dvb-fe-tool.c:48
 msgid ""
@@ -1592,43 +1599,43 @@ msgid "dvb_fe_get_stats failed"
 msgstr "»dvb_fe_get_stats« fehlgeschlagen"
 
 #: utils/dvb/dvb-fe-tool.c:199 utils/dvb/dvbv5-scan.c:146
-#: utils/dvb/dvbv5-zap.c:445
+#: utils/dvb/dvbv5-zap.c:444
 msgid "Quality"
 msgstr "Qualität"
 
 #: utils/dvb/dvb-fe-tool.c:202 utils/dvb/dvbv5-scan.c:149
-#: utils/dvb/dvbv5-zap.c:448
+#: utils/dvb/dvbv5-zap.c:447
 msgid "Signal"
 msgstr "Signal"
 
 # Carrier/Noise (Signal-/Rausch-Verhältnis)
 #: utils/dvb/dvb-fe-tool.c:205 utils/dvb/dvbv5-scan.c:152
-#: utils/dvb/dvbv5-zap.c:451
+#: utils/dvb/dvbv5-zap.c:450
 msgid "C/N"
 msgstr "S/R"
 
 #: utils/dvb/dvb-fe-tool.c:208 utils/dvb/dvbv5-scan.c:155
-#: utils/dvb/dvbv5-zap.c:454
+#: utils/dvb/dvbv5-zap.c:453
 msgid "UCB"
 msgstr "UCB (Anzahl unkorrigierter Fehler)"
 
 # BER = Bit-Fehlerrate
 #: utils/dvb/dvb-fe-tool.c:211 utils/dvb/dvbv5-scan.c:158
-#: utils/dvb/dvbv5-zap.c:457
+#: utils/dvb/dvbv5-zap.c:456
 msgid "postBER"
 msgstr "postBER"
 
 #: utils/dvb/dvb-fe-tool.c:214 utils/dvb/dvbv5-scan.c:161
-#: utils/dvb/dvbv5-zap.c:460
+#: utils/dvb/dvbv5-zap.c:459
 msgid "preBER"
 msgstr "preBER"
 
 #: utils/dvb/dvb-fe-tool.c:217 utils/dvb/dvbv5-scan.c:164
-#: utils/dvb/dvbv5-zap.c:463
+#: utils/dvb/dvbv5-zap.c:462
 msgid "PER"
 msgstr "PER"
 
-#: utils/dvb/dvb-fe-tool.c:346 utils/dvb/dvbv5-zap.c:1100
+#: utils/dvb/dvb-fe-tool.c:346 utils/dvb/dvbv5-zap.c:1098
 #, c-format
 msgid "Connecting to %s:%d\n"
 msgstr "Verbinden mit %s:%d\n"
@@ -1845,12 +1852,12 @@ msgstr "Scan-Frequenz #%d %d"
 msgid "<initial file>"
 msgstr "<Anfangsdatei>"
 
-#: utils/dvb/dvbv5-scan.c:496 utils/dvb/dvbv5-zap.c:1086
+#: utils/dvb/dvbv5-scan.c:496 utils/dvb/dvbv5-zap.c:1084
 #, c-format
 msgid "Please select one of the LNBf's below:\n"
 msgstr "Bitte wählen Sie einen der nachfolgenden LNBfs aus:\n"
 
-#: utils/dvb/dvbv5-scan.c:500 utils/dvb/dvbv5-zap.c:1090
+#: utils/dvb/dvbv5-scan.c:500 utils/dvb/dvbv5-zap.c:1088
 #, c-format
 msgid "Using LNBf "
 msgstr "Verwendet wird LNBf "
@@ -1860,17 +1867,17 @@ msgstr "Verwendet wird LNBf "
 msgid "ERROR: Please specify a valid format\n"
 msgstr "FEHLER: Bitte geben Sie ein gültiges Format an.\n"
 
-#: utils/dvb/dvbv5-scan.c:529 utils/dvb/dvbv5-zap.c:1112
+#: utils/dvb/dvbv5-scan.c:529 utils/dvb/dvbv5-zap.c:1110
 #, c-format
 msgid "Couldn't find demux device node\n"
 msgstr "Es wurde kein Demultiplexer-Geräteknoten gefunden.\n"
 
-#: utils/dvb/dvbv5-scan.c:536 utils/dvb/dvbv5-zap.c:1128
+#: utils/dvb/dvbv5-scan.c:536 utils/dvb/dvbv5-zap.c:1126
 #, c-format
 msgid "using demux '%s'\n"
 msgstr "Demultiplexer »%s« wird verwendet.\n"
 
-#: utils/dvb/dvbv5-scan.c:556 utils/dvb/dvbv5-zap.c:1160
+#: utils/dvb/dvbv5-scan.c:556 utils/dvb/dvbv5-zap.c:1158
 #, c-format
 msgid "Failed to set the country code:%s\n"
 msgstr "Setzen des Länderkennzeichens fehlgeschlagen:%s\n"
@@ -1956,8 +1963,8 @@ msgstr "packets_per_sec"
 
 #: utils/dvb/dvbv5-zap.c:128
 msgid ""
-"sets DVB low traffic threshold. PIDs with less than this amount of "
-"packets per second will be ignored. Default: 1 packet per second"
+"sets DVB low traffic threshold. PIDs with less than this amount of packets "
+"per second will be ignored. Default: 1 packet per second"
 msgstr ""
 "setzt die untere Schwelle für DVB-Datenaufkommen. PIDs mit einem kleineren "
 "Betrag von Paketen pro Sekunde werden ignoriert. Voreinstellung: 1 Paket pro "
@@ -1989,170 +1996,245 @@ msgstr "Dienst hat PID-Typ %02x: "
 msgid "tuning to %i Hz\n"
 msgstr "Einstellen auf %i Hz\n"
 
-#: utils/dvb/dvbv5-zap.c:566
+#: utils/dvb/dvbv5-zap.c:565
 #, c-format
 msgid "buffer overrun at %lld\n"
 msgstr "Pufferüberlauf bei %lld\n"
 
-#: utils/dvb/dvbv5-zap.c:568
+#: utils/dvb/dvbv5-zap.c:567
 #, c-format
 msgid "buffer overrun after %lld.%02ld seconds\n"
 msgstr "Pufferüberlauf nach %lld.%02ld Sekunden\n"
 
-#: utils/dvb/dvbv5-zap.c:593 utils/dvb/dvbv5-zap.c:835
+#: utils/dvb/dvbv5-zap.c:592 utils/dvb/dvbv5-zap.c:834
 msgid "Write failed"
 msgstr "Schreiben fehlgeschlagen"
 
-#: utils/dvb/dvbv5-zap.c:601
+#: utils/dvb/dvbv5-zap.c:600
 #, c-format
 msgid "received %lld bytes (%lld Kbytes/sec)\n"
 msgstr "%lld Byte empfangen (%lld Kilobyte/Sek)\n"
 
-#: utils/dvb/dvbv5-zap.c:604
+#: utils/dvb/dvbv5-zap.c:603
 #, c-format
 msgid "received %lld bytes\n"
 msgstr "%lld Byte empfangen\n"
 
-#: utils/dvb/dvbv5-zap.c:777 utils/dvb/dvbv5-zap.c:1253
+#: utils/dvb/dvbv5-zap.c:776 utils/dvb/dvbv5-zap.c:1251
 #, c-format
 msgid "dvb_dev_set_bufsize: buffer set to %d\n"
 msgstr "dvb_dev_set_bufsize: Puffer auf %d gesetzt\n"
 
-#: utils/dvb/dvbv5-zap.c:787
+#: utils/dvb/dvbv5-zap.c:786
 #, c-format
 msgid "  dvb_set_pesfilter to 0x2000\n"
 msgstr "  dvb_set_pesfilter auf 0x2000\n"
 
-#: utils/dvb/dvbv5-zap.c:796
+#: utils/dvb/dvbv5-zap.c:795
 #, c-format
 msgid "Can't get timespec\n"
 msgstr "Timespec kann nicht geholt werden\n"
 
-#: utils/dvb/dvbv5-zap.c:802
+#: utils/dvb/dvbv5-zap.c:801
 #, c-format
 msgid "%.2fs: Starting capture\n"
 msgstr "%.2fs: Aufnahme wird gestartet\n"
 
-#: utils/dvb/dvbv5-zap.c:814
+#: utils/dvb/dvbv5-zap.c:813
 #, c-format
 msgid "%.2fs: buffer overrun\n"
 msgstr "%.2fs: Pufferüberlauf\n"
 
-#: utils/dvb/dvbv5-zap.c:817
+#: utils/dvb/dvbv5-zap.c:816
 #, c-format
 msgid "%.2fs: read() returned error %zd\n"
 msgstr "%.2fs: read() gab den Fehler %zd zurück\n"
 
-#: utils/dvb/dvbv5-zap.c:840
+#: utils/dvb/dvbv5-zap.c:839
 #, c-format
 msgid "%.2fs: only read %zd bytes\n"
 msgstr "%.2fs: nur %zd Byte gelesen\n"
 
-#: utils/dvb/dvbv5-zap.c:847
+#: utils/dvb/dvbv5-zap.c:846
 #, c-format
 msgid "%.2fs: invalid sync byte. Discarding %zd bytes\n"
 msgstr "%.2fs: ungültiges Synchronisations-Byte. %zd Byte werden verworfen.\n"
 
-#: utils/dvb/dvbv5-zap.c:870
+#: utils/dvb/dvbv5-zap.c:869
 #, c-format
 msgid "%.2fs: invalid pid: 0x%04x\n"
 msgstr "%.2fs: ungültige PID: 0x%04x\n"
 
-#: utils/dvb/dvbv5-zap.c:897
+#: utils/dvb/dvbv5-zap.c:896
 #, c-format
 msgid "%.2fs: pid %d has adaption layer, but size is too small!\n"
 msgstr "%.2fs: PID %d hat Anpassungsebene, aber die Größe ist zu gering!\n"
 
-#: utils/dvb/dvbv5-zap.c:908
+#: utils/dvb/dvbv5-zap.c:907
 #, c-format
 msgid "%.2fs: pid %d, expecting %d received %d\n"
 msgstr "%.2fs: PID %d, erwartet %d empfangen %d\n"
 
-#: utils/dvb/dvbv5-zap.c:953
+#: utils/dvb/dvbv5-zap.c:952
 #, c-format
 msgid " PID           FREQ         SPEED       TOTAL\n"
 msgstr " PID           FREQ         TEMPO       GESAMT\n"
 
-#: utils/dvb/dvbv5-zap.c:978
+#: utils/dvb/dvbv5-zap.c:977
 #, c-format
 msgid "OTHER"
 msgstr "ANDERE"
 
-#: utils/dvb/dvbv5-zap.c:1004
+#: utils/dvb/dvbv5-zap.c:1003
 #, c-format
 msgid "%.2fs: Stopping capture\n"
 msgstr "%.2fs: Aufnahme wird gestoppt\n"
 
-#: utils/dvb/dvbv5-zap.c:1042
+#: utils/dvb/dvbv5-zap.c:1039
 msgid "DVB zap utility"
 msgstr "DVB-Umschaltwerkzeug"
 
-#: utils/dvb/dvbv5-zap.c:1043
+#: utils/dvb/dvbv5-zap.c:1040
 msgid "<channel name> [or <frequency> if in monitor mode]"
 msgstr "<Kanalname> [oder <Frequenz>, falls im Überwachungsmodus]"
 
-#: utils/dvb/dvbv5-zap.c:1120
+#: utils/dvb/dvbv5-zap.c:1118
 #, c-format
 msgid "Couldn't find dvr device node\n"
 msgstr "Es wurde kein DVR-Geräteknoten gefunden\n"
 
-#: utils/dvb/dvbv5-zap.c:1141
+#: utils/dvb/dvbv5-zap.c:1139
 #, c-format
 msgid "reading channels from file '%s'\n"
 msgstr "Kanäle werden aus Datei »%s« gelesen.\n"
 
-#: utils/dvb/dvbv5-zap.c:1182 utils/dvb/dvbv5-zap.c:1302
-#: utils/dvb/dvbv5-zap.c:1354
+#: utils/dvb/dvbv5-zap.c:1180 utils/dvb/dvbv5-zap.c:1300
+#: utils/dvb/dvbv5-zap.c:1352
 #, c-format
 msgid "open of '%s' failed"
 msgstr "Öffnen von »%s« fehlgeschlagen"
 
-#: utils/dvb/dvbv5-zap.c:1193
+#: utils/dvb/dvbv5-zap.c:1191
 #, c-format
 msgid "Service id 0x%04x was not specified at the file\n"
 msgstr "Dienstkennung 0x%04x wurde nicht in der Datei angegeben.\n"
 
-#: utils/dvb/dvbv5-zap.c:1206
+#: utils/dvb/dvbv5-zap.c:1204
 #, c-format
 msgid "couldn't find pmt-pid for sid %04x\n"
 msgstr "PMT-PID für SID %04x konnte nicht gefunden werden.\n"
 
-#: utils/dvb/dvbv5-zap.c:1240
+#: utils/dvb/dvbv5-zap.c:1238
 #, c-format
 msgid "pass all PID's to TS\n"
 msgstr "reicht alle PIDs an TS weiter.\n"
 
-#: utils/dvb/dvbv5-zap.c:1242
+#: utils/dvb/dvbv5-zap.c:1240
 #, c-format
 msgid "video pid %d\n"
 msgstr "Video-PID %d\n"
 
-#: utils/dvb/dvbv5-zap.c:1251 utils/dvb/dvbv5-zap.c:1277
+#: utils/dvb/dvbv5-zap.c:1249 utils/dvb/dvbv5-zap.c:1275
 #, c-format
 msgid "  dvb_set_pesfilter %d\n"
 msgstr "  dvb_set_pesfilter %d\n"
 
-#: utils/dvb/dvbv5-zap.c:1270
+#: utils/dvb/dvbv5-zap.c:1268
 #, c-format
 msgid "audio pid %d\n"
 msgstr "Audio-PID %d\n"
 
-#: utils/dvb/dvbv5-zap.c:1288
+#: utils/dvb/dvbv5-zap.c:1286
 #, c-format
 msgid "frontend doesn't lock\n"
 msgstr "Oberfläche sperrt nicht\n"
 
-#: utils/dvb/dvbv5-zap.c:1319
+#: utils/dvb/dvbv5-zap.c:1317
 #, c-format
 msgid "Record to file '%s' started\n"
 msgstr "Aufzeichnung in Datei »%s« gestartet\n"
 
-#: utils/dvb/dvbv5-zap.c:1338
+#: utils/dvb/dvbv5-zap.c:1336
 #, c-format
 msgid "DVR pipe interface '%s' will be opened\n"
 msgstr "DVR-Pipe-Schnittstelle »%s« wird geöffnet.\n"
 
-#: utils/dvb/dvbv5-zap.c:1362
+#: utils/dvb/dvbv5-zap.c:1360
 #, c-format
 msgid "DVR interface '%s' can now be opened\n"
 msgstr "DVR-Schnittstelle »%s« kann nun geöffnet werden.\n"
+
+#~ msgid "Clears the scancode to keycode mappings"
+#~ msgstr "leert die die Abbildungen der Scancodes auf Schlüsselcodes."
+
+#~ msgid "rc device to control, defaults to rc0 if not specified"
+#~ msgstr ""
+#~ "zu steuernde Fernbedienung, Voreinstellung ist rc@, falls nicht angegeben"
+
+#~ msgid "KEYMAP"
+#~ msgstr "KEYMAP"
+
+#~ msgid "Test if keymap is valid"
+#~ msgstr "Testet, ob die Schlüsselcodeabbildung gültig ist."
+
+#~ msgid "%s: keycode `%s' not recognised, no mapping\n"
+#~ msgstr "%s: Schlüsselcode »%s« nicht erkannt, keine Abbildung\n"
+
+#~ msgid "\tDriver: %s\n"
+#~ msgstr "\tTreiber %s\n"
+
+#~ msgid "\tDefault keymap: %s\n"
+#~ msgstr "\tStandardschlüsselcodeabbildung: %s\n"
+
+#~ msgid "\tInput device: %s\n"
+#~ msgstr "\tEingabegerät: %s\n"
+
+#~ msgid "KEYCODE"
+#~ msgstr "SCHLÜSSELCODE"
+
+#~ msgid "send IR keycode from keymap"
+#~ msgstr "sendet Infrarotschlüsselcode aus der Schlüsselcode-Abbildung"
+
+#~ msgid "output in mode2 format"
+#~ msgstr "Ausgabe im Modus-2-Format "
+
+#~ msgid "use keymap to send key from"
+#~ msgstr "Schlüsselcodeabbildung verwenden zum Schlüsselversand von"
+
+#~ msgid "%s:%d: error: expected integer, got `%s'\n"
+#~ msgstr "%s:%d: Fehler: Ganzzahl erwartet, »%s« erhalten\n"
+
+#~ msgid "%s:%d: error: pulse found where space expected `%s'\n"
+#~ msgstr "%s:%d: Fehler: Impuls gefunden, wo Pause erwartet wurde »%s«\n"
+
+#~ msgid "%s:%d: error: space found where pulse expected `%s'\n"
+#~ msgstr "%s:%d: Fehler: Pause gefunden, wo Impuls erwartet wurde »%s«\n"
+
+#~ msgid "%s:%d: error: value `%s' out of range\n"
+#~ msgstr "%s:%d: Fehler: Wert »%s« außerhalb des Bereichs\n"
+
+#~ msgid "%s: file is empty\n"
+#~ msgstr "%s: Datei ist leer\n"
+
+#~ msgid "key send can not be combined with receive or features option"
+#~ msgstr ""
+#~ "Senden des Schlüssels kann nicht mit Empfangs- oder "
+#~ "Funktionalitätenoption kombiniert werden."
+
+#~ msgid "error: protocol '%s' not supported\n"
+#~ msgstr "Fehler: Protokoll »%s« nicht unterstützt\n"
+
+#~ msgid "error: keycode `%s' not found in keymap\n"
+#~ msgstr ""
+#~ "Fehler: Schlüsselcode »%s« nicht in Schlüsselcodeabbildung gefunden\n"
+
+#~ msgid "warning: keycode `%s' has %d definitions in keymaps, using first\n"
+#~ msgstr ""
+#~ "Warnung: Schlüsselcode »%s« hat %d Definitionen in "
+#~ "Schlüsselcodeabbildungen, die erste wird benutzt.\n"
+
+#~ msgid " - Receiving timeout %u microseconds\n"
+#~ msgstr " - Empfangszeitüberschreitung %u Mikrosekunden\n"
+
+#~ msgid "error: no keymap specified\n"
+#~ msgstr "Fehler: keine Schlüsselcodeabbildung angegeben\n"

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 11:47 [PATCH] Minimal libv4l2 support for complex cameras Pavel Machek
@ 2020-03-23 11:57 ` Laurent Pinchart
  2020-03-23 12:22   ` Pavel Machek
  0 siblings, 1 reply; 9+ messages in thread
From: Laurent Pinchart @ 2020-03-23 11:57 UTC (permalink / raw)
  To: Pavel Machek
  Cc: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	linux-media

Hi Pavel,

Thank you for the patch.

On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> Hi!
> 
> We now have easy-to-install support for complex camera in form of
> Maemo Leste on N900.... Unfortunately we don't have anything in
> userspace that can be used to work with the camera.
> 
> This attempts to be minimal solution to get libv4l2 to work.

libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
pipeline handler to libcamera instead ? :-)

> It enables passing camera pipeline description to libv4l2, so that
> controls are mapped to appopriate devices, and libv4l2 can be used
> with complex camera.
> 
> It is useful for testing kernel parts of N900 subsystem, and it will
> serve as a basis for autofocus work and autogain improvements.
> 
> Signed-off-by: Pavel Machek <pavel@ucw.cz>

[snip]

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 11:57 ` Laurent Pinchart
@ 2020-03-23 12:22   ` Pavel Machek
  2020-03-23 12:24     ` Laurent Pinchart
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2020-03-23 12:22 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	linux-media

[-- Attachment #1: Type: text/plain, Size: 1209 bytes --]

Hi!

> Thank you for the patch.
> 
> On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> > Hi!
> > 
> > We now have easy-to-install support for complex camera in form of
> > Maemo Leste on N900.... Unfortunately we don't have anything in
> > userspace that can be used to work with the camera.
> > 
> > This attempts to be minimal solution to get libv4l2 to work.
> 
> libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
> pipeline handler to libcamera instead ? :-)

Why should it be instead?

I need something for kernel testing, and there is ton of apps using
it. Let me do this. libcamera might be future, but...

> > It enables passing camera pipeline description to libv4l2, so that
> > controls are mapped to appopriate devices, and libv4l2 can be used
> > with complex camera.
> > 
> > It is useful for testing kernel parts of N900 subsystem, and it will
> > serve as a basis for autofocus work and autogain improvements.
> > 
> > Signed-off-by: Pavel Machek <pavel@ucw.cz>

Best regards,
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 12:22   ` Pavel Machek
@ 2020-03-23 12:24     ` Laurent Pinchart
  2020-03-23 12:59       ` Mauro Carvalho Chehab
  2020-03-23 13:19       ` Pavel Machek
  0 siblings, 2 replies; 9+ messages in thread
From: Laurent Pinchart @ 2020-03-23 12:24 UTC (permalink / raw)
  To: Pavel Machek
  Cc: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	linux-media

Hi Pavel,

On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
> > On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> >> Hi!
> >> 
> >> We now have easy-to-install support for complex camera in form of
> >> Maemo Leste on N900.... Unfortunately we don't have anything in
> >> userspace that can be used to work with the camera.
> >> 
> >> This attempts to be minimal solution to get libv4l2 to work.
> > 
> > libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
> > pipeline handler to libcamera instead ? :-)
> 
> Why should it be instead?
> 
> I need something for kernel testing, and there is ton of apps using
> it. Let me do this. libcamera might be future, but...

Sure, if it's useful for you, I won't prevent you from developing any
code you want :-) But there's very little chance of getting it merged,
and it would be useful to more people to have a support for that
platform in libcamera. It's really your decision, and I'm not blaming
you.

> >> It enables passing camera pipeline description to libv4l2, so that
> >> controls are mapped to appopriate devices, and libv4l2 can be used
> >> with complex camera.
> >> 
> >> It is useful for testing kernel parts of N900 subsystem, and it will
> >> serve as a basis for autofocus work and autogain improvements.
> >> 
> >> Signed-off-by: Pavel Machek <pavel@ucw.cz>

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 12:24     ` Laurent Pinchart
@ 2020-03-23 12:59       ` Mauro Carvalho Chehab
  2020-03-23 13:43         ` Laurent Pinchart
  2020-03-23 13:19       ` Pavel Machek
  1 sibling, 1 reply; 9+ messages in thread
From: Mauro Carvalho Chehab @ 2020-03-23 12:59 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: Pavel Machek, sean, hverkuil-cisco, mchehab+samsung,
	sakari.ailus, linux-media

Em Mon, 23 Mar 2020 14:24:42 +0200
Laurent Pinchart <laurent.pinchart@ideasonboard.com> escreveu:

> Hi Pavel,
> 
> On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
> > > On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> > >> Hi!
> > >> 
> > >> We now have easy-to-install support for complex camera in form of
> > >> Maemo Leste on N900.... Unfortunately we don't have anything in
> > >> userspace that can be used to work with the camera.
> > >> 
> > >> This attempts to be minimal solution to get libv4l2 to work.
> > > 
> > > libv4l2 is mostly deprecated.

Well, not really... I guess lots of userspace apps rely on it
(qv4l2, xawtv, tvtime, camorama, zbar, ...).

In order to be able to deprecate it, we need to add some code there
to let them bind via libcamera and test them with different hardware,
including the non-UVC ones.

> > > How about contributing an OMAP3 ISP
> > > pipeline handler to libcamera instead ? :-)
> > 
> > Why should it be instead?
> > 
> > I need something for kernel testing, and there is ton of apps using
> > it. Let me do this. libcamera might be future, but...
> 
> Sure, if it's useful for you, I won't prevent you from developing any
> code you want :-) But there's very little chance of getting it merged,
> and it would be useful to more people to have a support for that
> platform in libcamera. It's really your decision, and I'm not blaming
> you.

I created some time ago a fork of v4l-utils in order to be able to
merge the N900 work from Pavel. We can add the N900 work there - or 
on a separate branch at the main v4l-utils tree.

Thanks,
Mauro

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 12:24     ` Laurent Pinchart
  2020-03-23 12:59       ` Mauro Carvalho Chehab
@ 2020-03-23 13:19       ` Pavel Machek
  2020-03-23 13:52         ` Laurent Pinchart
  1 sibling, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2020-03-23 13:19 UTC (permalink / raw)
  To: Laurent Pinchart
  Cc: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	linux-media

[-- Attachment #1: Type: text/plain, Size: 1612 bytes --]

Hi!

> On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
> > > On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> > >> Hi!
> > >> 
> > >> We now have easy-to-install support for complex camera in form of
> > >> Maemo Leste on N900.... Unfortunately we don't have anything in
> > >> userspace that can be used to work with the camera.
> > >> 
> > >> This attempts to be minimal solution to get libv4l2 to work.
> > > 
> > > libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
> > > pipeline handler to libcamera instead ? :-)
> > 
> > Why should it be instead?
> > 
> > I need something for kernel testing, and there is ton of apps using
> > it. Let me do this. libcamera might be future, but...
> 
> Sure, if it's useful for you, I won't prevent you from developing any
> code you want :-) But there's very little chance of getting it merged,
> and it would be useful to more people to have a support for that
> platform in libcamera. It's really your decision, and I'm not blaming
> you.

When you have libcamera ready, you'll still need some hardware and
kernel to work with it. Do you have something more suitable than
N9/N900? Droid 4 has separate CPU to run the camera, Librem 5 camera
does not have autofocus (and I believe nor has PinePhone).

My patch is not complex, and libv4l2 is full of similar hardware
support code. What would be reason not to merge it?

Best regards,
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 12:59       ` Mauro Carvalho Chehab
@ 2020-03-23 13:43         ` Laurent Pinchart
  0 siblings, 0 replies; 9+ messages in thread
From: Laurent Pinchart @ 2020-03-23 13:43 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Pavel Machek, sean, hverkuil-cisco, mchehab+samsung,
	sakari.ailus, linux-media

Hi Mauro,

On Mon, Mar 23, 2020 at 01:59:33PM +0100, Mauro Carvalho Chehab wrote:
> Em Mon, 23 Mar 2020 14:24:42 +0200 Laurent Pinchart escreveu:
> > On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
> > > > On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> > > >> Hi!
> > > >> 
> > > >> We now have easy-to-install support for complex camera in form of
> > > >> Maemo Leste on N900.... Unfortunately we don't have anything in
> > > >> userspace that can be used to work with the camera.
> > > >> 
> > > >> This attempts to be minimal solution to get libv4l2 to work.
> > > > 
> > > > libv4l2 is mostly deprecated.
> 
> Well, not really... I guess lots of userspace apps rely on it
> (qv4l2, xawtv, tvtime, camorama, zbar, ...).
>
> In order to be able to deprecate it, we need to add some code there
> to let them bind via libcamera and test them with different hardware,
> including the non-UVC ones.

qv4l2 is out of scope, as that's a V4L2 test application, so it really
needs to stay as close as possible to V4L2 :-) TV applications are also
not candidates for porting to libcamera, as libcamera doesn't support TV
capture. Sure, they can use non-TV capture devices, but it's really a
completely different world. I don't mind if someone wants to try and
integrate libcamera support in the above applications, but I'd also be
happy to let them as they are and move on.

I'm not calling for libv4l2 to be removed, but new developments
shouldn't use it. We've been telling developers to go for the V4L2 API
directly instead unless some libv4l2 features are mandatory for their
use case (such as support for the custom compression formats of those
ancient webcams). It makes no sense, from a community point of view, to
invest in that project to support complex cameras.

> > > > How about contributing an OMAP3 ISP
> > > > pipeline handler to libcamera instead ? :-)
> > > 
> > > Why should it be instead?
> > > 
> > > I need something for kernel testing, and there is ton of apps using
> > > it. Let me do this. libcamera might be future, but...
> > 
> > Sure, if it's useful for you, I won't prevent you from developing any
> > code you want :-) But there's very little chance of getting it merged,
> > and it would be useful to more people to have a support for that
> > platform in libcamera. It's really your decision, and I'm not blaming
> > you.
> 
> I created some time ago a fork of v4l-utils in order to be able to
> merge the N900 work from Pavel. We can add the N900 work there - or 
> on a separate branch at the main v4l-utils tree.

It's open source, forks are encouraged. I believe it would be a waste of
time, but it's not my time, so I don't mind :-)

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 13:19       ` Pavel Machek
@ 2020-03-23 13:52         ` Laurent Pinchart
  2020-04-14  9:11           ` Hans Verkuil
  0 siblings, 1 reply; 9+ messages in thread
From: Laurent Pinchart @ 2020-03-23 13:52 UTC (permalink / raw)
  To: Pavel Machek
  Cc: sean, hverkuil-cisco, mchehab+samsung, mchehab, sakari.ailus,
	linux-media

Hi,

On Mon, Mar 23, 2020 at 02:19:23PM +0100, Pavel Machek wrote:
> > On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
> > > > On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
> > > >> Hi!
> > > >> 
> > > >> We now have easy-to-install support for complex camera in form of
> > > >> Maemo Leste on N900.... Unfortunately we don't have anything in
> > > >> userspace that can be used to work with the camera.
> > > >> 
> > > >> This attempts to be minimal solution to get libv4l2 to work.
> > > > 
> > > > libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
> > > > pipeline handler to libcamera instead ? :-)
> > > 
> > > Why should it be instead?
> > > 
> > > I need something for kernel testing, and there is ton of apps using
> > > it. Let me do this. libcamera might be future, but...
> > 
> > Sure, if it's useful for you, I won't prevent you from developing any
> > code you want :-) But there's very little chance of getting it merged,
> > and it would be useful to more people to have a support for that
> > platform in libcamera. It's really your decision, and I'm not blaming
> > you.
> 
> When you have libcamera ready, you'll still need some hardware and
> kernel to work with it. Do you have something more suitable than
> N9/N900? Droid 4 has separate CPU to run the camera, Librem 5 camera
> does not have autofocus (and I believe nor has PinePhone).

OMAP3 is great as a test bed for camera opinion. It's widely available,
has amazing documentation, and even though the hardware is aging a
little bit, it's still very decent and has a nice ISP. Even better,
there's good kernel support for it, so it's a really good platform in my
opinion. The only reason we don't support it yet in libcamera is lack of
spare time, I would really love to see that happening, and it would be
first-class citizen in the code base.

> My patch is not complex, and libv4l2 is full of similar hardware
> support code. What would be reason not to merge it?

It has to be reviewed and maintained. From a V4L2 community point of
view, I don't think it makes sense to invest time on a dying component
(I'm talking about libv4l2, not OMAP3). But from a personal point of
view, if you find libv4l2 useful to develop code for the OMAP3 and
experiment, I see no issue with that. If other reviewers and maintainers
of libv4l2 disagree and want to invest their time in this, I won't stop
them, but I wanted to warn that this is a dying project.

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Minimal libv4l2 support for complex cameras
  2020-03-23 13:52         ` Laurent Pinchart
@ 2020-04-14  9:11           ` Hans Verkuil
  0 siblings, 0 replies; 9+ messages in thread
From: Hans Verkuil @ 2020-04-14  9:11 UTC (permalink / raw)
  To: Laurent Pinchart, Pavel Machek
  Cc: sean, mchehab+samsung, mchehab, sakari.ailus, linux-media

On 23/03/2020 14:52, Laurent Pinchart wrote:
> Hi,
> 
> On Mon, Mar 23, 2020 at 02:19:23PM +0100, Pavel Machek wrote:
>>> On Mon, Mar 23, 2020 at 01:22:17PM +0100, Pavel Machek wrote:
>>>>> On Mon, Mar 23, 2020 at 12:47:27PM +0100, Pavel Machek wrote:
>>>>>> Hi!
>>>>>>
>>>>>> We now have easy-to-install support for complex camera in form of
>>>>>> Maemo Leste on N900.... Unfortunately we don't have anything in
>>>>>> userspace that can be used to work with the camera.
>>>>>>
>>>>>> This attempts to be minimal solution to get libv4l2 to work.
>>>>>
>>>>> libv4l2 is mostly deprecated. How about contributing an OMAP3 ISP
>>>>> pipeline handler to libcamera instead ? :-)
>>>>
>>>> Why should it be instead?
>>>>
>>>> I need something for kernel testing, and there is ton of apps using
>>>> it. Let me do this. libcamera might be future, but...
>>>
>>> Sure, if it's useful for you, I won't prevent you from developing any
>>> code you want :-) But there's very little chance of getting it merged,
>>> and it would be useful to more people to have a support for that
>>> platform in libcamera. It's really your decision, and I'm not blaming
>>> you.
>>
>> When you have libcamera ready, you'll still need some hardware and
>> kernel to work with it. Do you have something more suitable than
>> N9/N900? Droid 4 has separate CPU to run the camera, Librem 5 camera
>> does not have autofocus (and I believe nor has PinePhone).
> 
> OMAP3 is great as a test bed for camera opinion. It's widely available,
> has amazing documentation, and even though the hardware is aging a
> little bit, it's still very decent and has a nice ISP. Even better,
> there's good kernel support for it, so it's a really good platform in my
> opinion. The only reason we don't support it yet in libcamera is lack of
> spare time, I would really love to see that happening, and it would be
> first-class citizen in the code base.
> 
>> My patch is not complex, and libv4l2 is full of similar hardware
>> support code. What would be reason not to merge it?
> 
> It has to be reviewed and maintained. From a V4L2 community point of
> view, I don't think it makes sense to invest time on a dying component
> (I'm talking about libv4l2, not OMAP3). But from a personal point of
> view, if you find libv4l2 useful to develop code for the OMAP3 and
> experiment, I see no issue with that. If other reviewers and maintainers
> of libv4l2 disagree and want to invest their time in this, I won't stop
> them, but I wanted to warn that this is a dying project.
> 

It's not so much the reviewing/maintaining part that is a concern for me,
it is the fact that this would create yet another way to support complex
cameras, when we made the decision to use libcamera for that instead.

I don't want two APIs, and vendors certainly don't want two APIs.

I agree with Laurent that adding OMAP3 support to libcamera would be much
more useful than adding a libv4l hack.

Regards,

	Hans

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-04-14  9:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-23 11:47 [PATCH] Minimal libv4l2 support for complex cameras Pavel Machek
2020-03-23 11:57 ` Laurent Pinchart
2020-03-23 12:22   ` Pavel Machek
2020-03-23 12:24     ` Laurent Pinchart
2020-03-23 12:59       ` Mauro Carvalho Chehab
2020-03-23 13:43         ` Laurent Pinchart
2020-03-23 13:19       ` Pavel Machek
2020-03-23 13:52         ` Laurent Pinchart
2020-04-14  9:11           ` Hans Verkuil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).