summaryrefslogtreecommitdiff
path: root/v4l2-apps/util
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-03-12 11:10:42 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-12 11:10:42 -0300
commit7787613f5c5a3a00ebd6aca9893ef2c4ad679bc1 (patch)
tree4ffb8dbda509405c10b484edacb44807b16c5466 /v4l2-apps/util
parent84c19b03d182a3ad1a04fa4be0772ef587225fe6 (diff)
parentd32bcc1401cca5f2ea369ce78ab70947034b5c8f (diff)
downloadmediapointer-dvb-s2-7787613f5c5a3a00ebd6aca9893ef2c4ad679bc1.tar.gz
mediapointer-dvb-s2-7787613f5c5a3a00ebd6aca9893ef2c4ad679bc1.tar.bz2
merge: http://jusst.de/hg/v4l-dvb
From: Mauro Carvalho Chehab <mchehab@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'v4l2-apps/util')
-rw-r--r--v4l2-apps/util/Makefile10
-rwxr-xr-xv4l2-apps/util/parse-sniffusb2.pl84
-rw-r--r--v4l2-apps/util/qv4l2/ctrl-tab.cpp2
-rw-r--r--v4l2-apps/util/qv4l2/general-tab.cpp2
-rw-r--r--v4l2-apps/util/qv4l2/qv4l2.cpp2
-rw-r--r--v4l2-apps/util/qv4l2/qv4l2.pro4
-rw-r--r--v4l2-apps/util/v4l2-ctl.cpp123
-rw-r--r--v4l2-apps/util/v4l2-sysfs-path.c191
8 files changed, 407 insertions, 11 deletions
diff --git a/v4l2-apps/util/Makefile b/v4l2-apps/util/Makefile
index b80de190b..6f9d1071a 100644
--- a/v4l2-apps/util/Makefile
+++ b/v4l2-apps/util/Makefile
@@ -7,7 +7,7 @@ endif
CPPFLAGS += -I../include -D_GNU_SOURCE
LDFLAGS += -lm
-binaries = v4l2-ctl v4l2-dbg v4l2-compliance ivtv-ctl cx18-ctl
+binaries = v4l2-ctl v4l2-dbg v4l2-compliance ivtv-ctl cx18-ctl v4l2-sysfs-path
ifeq ($(prefix),)
prefix = /usr
@@ -34,6 +34,14 @@ v4l2-dbg: v4l2-dbg.o v4l2-chipids.o
v4l2-dbg.o: v4l2-dbg.h v4l2-dbg-bttv.h v4l2-dbg-em28xx.h v4l2-dbg-saa7134.h
+v4l2-sysfs-path.o: v4l2-sysfs-path.c ../libv4l2util/v4l2_driver.h
+
+v4l2-sysfs-path: v4l2-sysfs-path.o ../libv4l2util/libv4l2util.a
+ $(CC) $^ -o $@ -lsysfs
+
+../libv4l2util/libv4l2util.a:
+ $(MAKE) -C ../libv4l2util libv4l2util.a
+
install:
mkdir -p $(prefix)/bin
cp $(binaries) $(prefix)/bin
diff --git a/v4l2-apps/util/parse-sniffusb2.pl b/v4l2-apps/util/parse-sniffusb2.pl
new file mode 100755
index 000000000..34406b0ea
--- /dev/null
+++ b/v4l2-apps/util/parse-sniffusb2.pl
@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+#
+# Author: Franklin Meng <fmeng2002@yahoo.com>
+# Parser for USB snoops captured from SniffUSB 2.0.
+#
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+foreach my $curfile (@ARGV) {
+ parsefile($curfile);
+ #we can only process 1 file
+ exit;
+}
+
+sub parsefile {
+ my $curfile = shift;
+ my $SetupPacket ='';
+ my $preS = '';
+ my $TransferBuffer ='';
+ my $preT = '';
+ my $Direction ='';
+ my $preD = '';
+ my @tmpsplit;
+ my $t=0;
+ my $s=0;
+
+ open(FD, $curfile) || die("Error: $!\n");
+
+ while(<FD>) {
+ chomp;
+ if($t==1 && /^\s+\d{8}/) {
+# print $_ . "\n";
+ @tmpsplit = split(/\:\s/,$_);
+ $TransferBuffer = $TransferBuffer . $tmpsplit[1] . " ";
+ } elsif($s==1 && /^\s+\d{8}/) {
+# print $_ . "\n";
+ @tmpsplit = split(/\:\s/,$_);
+ $SetupPacket = $SetupPacket . $tmpsplit[1] ;
+ } else {
+ $t=0;
+ $s=0;
+ }
+ if(/[<>]{3}/){
+ #print out last packet if valid
+ if($SetupPacket) {
+ if($preT) {
+ print "$SetupPacket $preD $preT\n";
+
+ } else {
+ print "$SetupPacket $Direction $TransferBuffer\n";
+ }
+ }
+# print "$SetupPacket $Direction $TransferBuffer\n";
+ #clear variables
+ $preT = $TransferBuffer;
+ $TransferBuffer = '';
+ $preS = $SetupPacket;
+ $SetupPacket = '';
+ $preD = $Direction;
+ $t = 0;
+ $s = 0;
+ # get direction
+ @tmpsplit = split(/\s+/, $_);
+ $Direction = $tmpsplit[2];
+# print $_ . "\n";
+ } elsif(/TransferBufferMDL/) {
+ $t = 1
+ } elsif(/SetupPacket/) {
+ $s = 1;
+ }
+ }
+ #print last packet
+# print "$SetupPacket $Direction $TransferBuffer\n";
+ if($SetupPacket) {
+ if($preT) {
+ print "$SetupPacket $preD $preT\n";
+ } else {
+ print "$SetupPacket $Direction $TransferBuffer\n";
+ }
+ }
+}
+
diff --git a/v4l2-apps/util/qv4l2/ctrl-tab.cpp b/v4l2-apps/util/qv4l2/ctrl-tab.cpp
index c7d1a275c..6f436b494 100644
--- a/v4l2-apps/util/qv4l2/ctrl-tab.cpp
+++ b/v4l2-apps/util/qv4l2/ctrl-tab.cpp
@@ -1,6 +1,6 @@
#include "qv4l2.h"
-#include "v4l2.h"
+#include "libv4l2util.h"
#include <qstatusbar.h>
#include <qlineedit.h>
diff --git a/v4l2-apps/util/qv4l2/general-tab.cpp b/v4l2-apps/util/qv4l2/general-tab.cpp
index 3b9ad2e5b..78656cf10 100644
--- a/v4l2-apps/util/qv4l2/general-tab.cpp
+++ b/v4l2-apps/util/qv4l2/general-tab.cpp
@@ -20,7 +20,7 @@
#include "qv4l2.h"
#include "general-tab.h"
-#include "v4l2.h"
+#include "libv4l2util.h"
#include <qlabel.h>
#include <qspinbox.h>
diff --git a/v4l2-apps/util/qv4l2/qv4l2.cpp b/v4l2-apps/util/qv4l2/qv4l2.cpp
index d144723d9..764fbd172 100644
--- a/v4l2-apps/util/qv4l2/qv4l2.cpp
+++ b/v4l2-apps/util/qv4l2/qv4l2.cpp
@@ -1,7 +1,7 @@
#include "qv4l2.h"
#include "general-tab.h"
-#include "v4l2.h"
+#include "libv4l2util.h"
#include <qimage.h>
#include <qpixmap.h>
diff --git a/v4l2-apps/util/qv4l2/qv4l2.pro b/v4l2-apps/util/qv4l2/qv4l2.pro
index 5e0b7555d..96adb7260 100644
--- a/v4l2-apps/util/qv4l2/qv4l2.pro
+++ b/v4l2-apps/util/qv4l2/qv4l2.pro
@@ -3,10 +3,10 @@
######################################################################
TEMPLATE = app
-INCLUDEPATH += . ../../include ../../lib
+INCLUDEPATH += . ../../include ../../libv4l2util
CONFIG += debug
# Input
HEADERS += qv4l2.h general-tab.h
SOURCES += qv4l2.cpp general-tab.cpp ctrl-tab.cpp
-LIBS += -lv4l2 -L../../lib
+LIBS += -lv4l2util -L../../libv4l2util
diff --git a/v4l2-apps/util/v4l2-ctl.cpp b/v4l2-apps/util/v4l2-ctl.cpp
index 7d5988571..dec9edd61 100644
--- a/v4l2-apps/util/v4l2-ctl.cpp
+++ b/v4l2-apps/util/v4l2-ctl.cpp
@@ -129,6 +129,8 @@ enum Option {
OptGetOverlayCropCap,
OptGetOutputOverlayCropCap,
OptOverlay,
+ OptGetJpegComp,
+ OptSetJpegComp,
OptListDevices,
OptLast = 256
};
@@ -256,6 +258,8 @@ static struct option long_options[] = {
{"get-cropcap-output-overlay", no_argument, 0, OptGetOutputOverlayCropCap},
{"get-crop-output-overlay", no_argument, 0, OptGetOutputOverlayCrop},
{"set-crop-output-overlay", required_argument, 0, OptSetOutputOverlayCrop},
+ {"get-jpeg-comp", no_argument, 0, OptGetJpegComp},
+ {"set-jpeg-comp", required_argument, 0, OptSetJpegComp},
{"overlay", required_argument, 0, OptOverlay},
{"list-devices", no_argument, 0, OptListDevices},
{0, 0, 0, 0}
@@ -380,6 +384,16 @@ static void usage(void)
" query the video output overlay crop window [VIDIOC_G_CROP]\n"
" --set-crop-output-overlay=top=<x>,left=<y>,width=<w>,height=<h>\n"
" set the video output overlay crop window [VIDIOC_S_CROP]\n"
+ " --get-jpeg-comp query the JPEG compression [VIDIOC_G_JPEGCOMP]\n"
+ " --set-jpeg-comp=quality=<q>,markers=<markers>,comment=<c>,app<n>=<a>\n"
+ " set the JPEG compression [VIDIOC_S_JPEGCOMP]\n"
+ " <n> is the app segment: 0-9 or a-f, <a> is the actual string.\n"
+ " <markers> is a colon separated list of:\n"
+ " dht: Define Huffman Tables\n"
+ " dqt: Define Quantization Tables\n"
+ " dri: Define Restart Interval\n"
+ " --set-audio-output=<num>\n"
+ " set the audio output to <num> [VIDIOC_S_AUDOUT]\n"
" --get-audio-input query the audio input [VIDIOC_G_AUDIO]\n"
" --set-audio-input=<num>\n"
" set the audio input to <num> [VIDIOC_S_AUDIO]\n"
@@ -576,11 +590,12 @@ static void print_qctrl(int fd, struct v4l2_queryctrl *queryctrl,
}
if (queryctrl->flags) {
const flag_def def[] = {
- { V4L2_CTRL_FLAG_GRABBED, "grabbed" },
- { V4L2_CTRL_FLAG_READ_ONLY, "readonly" },
- { V4L2_CTRL_FLAG_UPDATE, "update" },
- { V4L2_CTRL_FLAG_INACTIVE, "inactive" },
- { V4L2_CTRL_FLAG_SLIDER, "slider" },
+ { V4L2_CTRL_FLAG_GRABBED, "grabbed" },
+ { V4L2_CTRL_FLAG_READ_ONLY, "read-only" },
+ { V4L2_CTRL_FLAG_UPDATE, "update" },
+ { V4L2_CTRL_FLAG_INACTIVE, "inactive" },
+ { V4L2_CTRL_FLAG_SLIDER, "slider" },
+ { V4L2_CTRL_FLAG_WRITE_ONLY, "write-only" },
{ 0, NULL }
};
printf(" flags=%s", flags2s(queryctrl->flags, def).c_str());
@@ -750,6 +765,35 @@ static void printfbuf(const struct v4l2_framebuffer &fb)
}
}
+static std::string markers2s(unsigned markers)
+{
+ std::string s;
+
+ if (markers & V4L2_JPEG_MARKER_DHT)
+ s += "\t\tDefine Huffman Tables\n";
+ if (markers & V4L2_JPEG_MARKER_DQT)
+ s += "\t\tDefine Quantization Tables\n";
+ if (markers & V4L2_JPEG_MARKER_DRI)
+ s += "\t\tDefine Restart Interval\n";
+ if (markers & V4L2_JPEG_MARKER_COM)
+ s += "\t\tDefine Comment\n";
+ if (markers & V4L2_JPEG_MARKER_APP)
+ s += "\t\tDefine APP segment\n";
+ return s;
+}
+
+static void printjpegcomp(const struct v4l2_jpegcompression &jc)
+{
+ printf("JPEG compression:\n");
+ printf("\tQuality: %d\n", jc.quality);
+ if (jc.COM_len)
+ printf("\tComment: '%s'\n", jc.COM_data);
+ if (jc.APP_len)
+ printf("\tAPP%x : '%s'\n", jc.APPn, jc.APP_data);
+ printf("\tMarkers: 0x%08lx\n", jc.jpeg_markers);
+ printf("%s", markers2s(jc.jpeg_markers).c_str());
+}
+
static void printcrop(const struct v4l2_crop &crop)
{
printf("Crop: Left %d, Top %d, Width %d, Height %d\n",
@@ -1337,6 +1381,7 @@ int main(int argc, char **argv)
struct v4l2_rect vcrop_overlay; /* crop rect */
struct v4l2_rect vcrop_out_overlay; /* crop rect */
struct v4l2_framebuffer fbuf; /* fbuf */
+ struct v4l2_jpegcompression jpegcomp; /* jpeg compression */
int input; /* set_input/get_input */
int output; /* set_output/get_output */
v4l2_std_id std; /* get_std/set_std */
@@ -1371,6 +1416,7 @@ int main(int argc, char **argv)
memset(&vf, 0, sizeof(vf));
memset(&vs, 0, sizeof(vs));
memset(&fbuf, 0, sizeof(fbuf));
+ memset(&jpegcomp, 0, sizeof(jpegcomp));
if (argc == 1) {
usage();
@@ -1700,6 +1746,62 @@ int main(int argc, char **argv)
}
break;
}
+ case OptSetJpegComp:
+ {
+ subs = optarg;
+ while (*subs != '\0') {
+ static const char *const subopts[] = {
+ "app0", "app1", "app2", "app3",
+ "app4", "app5", "app6", "app7",
+ "app8", "app9", "appa", "appb",
+ "appc", "appd", "appe", "appf",
+ "quality",
+ "markers",
+ "comment",
+ NULL
+ };
+ int len;
+ int opt = parse_subopt(&subs, subopts, &value);
+
+ switch (opt) {
+ case 16:
+ jpegcomp.quality = strtol(value, 0L, 0);
+ break;
+ case 17:
+ if (strstr(value, "dht"))
+ jpegcomp.jpeg_markers |= V4L2_JPEG_MARKER_DHT;
+ if (strstr(value, "dqt"))
+ jpegcomp.jpeg_markers |= V4L2_JPEG_MARKER_DQT;
+ if (strstr(value, "dri"))
+ jpegcomp.jpeg_markers |= V4L2_JPEG_MARKER_DRI;
+ break;
+ case 18:
+ len = strlen(value);
+ if (len > sizeof(jpegcomp.COM_data) - 1)
+ len = sizeof(jpegcomp.COM_data) - 1;
+ jpegcomp.COM_len = len;
+ memcpy(jpegcomp.COM_data, value, len);
+ jpegcomp.COM_data[len] = '\0';
+ break;
+ default:
+ if (opt < 0 || opt > 15)
+ break;
+ len = strlen(value);
+ if (len > sizeof(jpegcomp.APP_data) - 1)
+ len = sizeof(jpegcomp.APP_data) - 1;
+ if (jpegcomp.APP_len) {
+ fprintf(stderr, "Only one APP segment can be set\n");
+ break;
+ }
+ jpegcomp.APP_len = len;
+ memcpy(jpegcomp.APP_data, value, len);
+ jpegcomp.APP_data[len] = '\0';
+ jpegcomp.APPn = opt;
+ break;
+ }
+ }
+ break;
+ }
case OptListDevices:
list_devices();
break;
@@ -1768,6 +1870,7 @@ int main(int argc, char **argv)
options[OptGetFBuf] = 1;
options[OptGetCropCap] = 1;
options[OptGetOutputCropCap] = 1;
+ options[OptGetJpegComp] = 1;
options[OptSilent] = 1;
}
@@ -1987,6 +2090,10 @@ set_vid_fmt_error:
}
}
+ if (options[OptSetJpegComp]) {
+ doioctl(fd, VIDIOC_S_JPEGCOMP, &jpegcomp, "VIDIOC_S_JPEGCOMP");
+ }
+
if (options[OptOverlay]) {
doioctl(fd, VIDIOC_OVERLAY, &overlay, "VIDIOC_OVERLAY");
}
@@ -2110,6 +2217,12 @@ set_vid_fmt_error:
printfbuf(fb);
}
+ if (options[OptGetJpegComp]) {
+ struct v4l2_jpegcompression jc;
+ if (doioctl(fd, VIDIOC_G_JPEGCOMP, &jc, "VIDIOC_G_JPEGCOMP") == 0)
+ printjpegcomp(jc);
+ }
+
if (options[OptGetCropCap]) {
struct v4l2_cropcap cropcap;
diff --git a/v4l2-apps/util/v4l2-sysfs-path.c b/v4l2-apps/util/v4l2-sysfs-path.c
new file mode 100644
index 000000000..e3f3e63e8
--- /dev/null
+++ b/v4l2-apps/util/v4l2-sysfs-path.c
@@ -0,0 +1,191 @@
+/*
+ Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@redhat.com>
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation version 2 of the License.
+
+ The sysfs logic were adapted from a C++/Boost snippet code sent by
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "../libv4l2util/v4l2_driver.h"
+#include <sysfs/libsysfs.h>
+#include <errno.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <dirent.h>
+
+#define USB_ID "usb-"
+#define PCI_ID "PCI:"
+#define PCIe_ID "PCIe:"
+
+char *obtain_bus_sysfs_path(char *bus_info)
+{
+ struct sysfs_device *pcictl = NULL;
+ struct sysfs_bus *bus = NULL;
+ struct sysfs_device *busdev = NULL;
+ struct dlist *busdevs = NULL;
+ struct sysfs_device *pdev = NULL;
+ char *tmp = NULL, *busname, *buspath;
+ int pci;
+
+ if (!strncmp(bus_info, USB_ID, strlen(USB_ID))) {
+ bus_info += strlen(USB_ID);
+ pci = 0;
+ } else if (!strncmp(bus_info, PCI_ID, strlen(PCI_ID))) {
+ bus_info += strlen(PCI_ID);
+ pci = 1;
+ } else if (!strncmp(bus_info, PCIe_ID, strlen(PCIe_ID))) {
+ bus_info += strlen(PCIe_ID);
+ pci = 1;
+ } else
+ return NULL;
+
+ busname = strtok(bus_info, "-");
+ if (!busname)
+ return NULL;
+
+ buspath = strtok(NULL, "-");
+ if (!buspath && !pci)
+ return NULL;
+
+ /* open bus host controller */
+ pcictl = sysfs_open_device("pci", busname);
+ if (!pcictl)
+ goto err;
+
+ /* We have all we need for PCI devices */
+ if (pci) {
+ char *name;
+
+ asprintf(&name, "%s", pcictl->path);
+ return name;
+ }
+
+ /* find matching usb bus */
+ bus = sysfs_open_bus("usb");
+ if (!bus)
+ goto err;
+
+ busdevs = sysfs_get_bus_devices(bus);
+ if (!busdevs)
+ goto err;
+
+ dlist_for_each_data(busdevs, busdev, struct sysfs_device) {
+ /* compare pathes of bus host controller and
+ parent of enumerated bus devices */
+
+ pdev = sysfs_get_device_parent(busdev);
+ if (!pdev)
+ continue;
+
+ if (!strcmp(pcictl->path, pdev->path))
+ break;
+ }
+
+ if (!pdev)
+ goto err;
+
+ sysfs_close_device(pcictl);
+ pcictl = NULL;
+
+ /* assemble bus device path */
+ if (busdev) {
+ struct sysfs_attribute *busnumattr;
+ unsigned int busnum;
+ char *name;
+
+ busnumattr = sysfs_get_device_attr(busdev, "busnum");
+ if (!busnumattr)
+ goto err;
+
+ tmp = malloc(busnumattr->len + 1);
+ strncpy(tmp, busnumattr->value, busnumattr->len);
+ tmp[busnumattr->len] = '\0';
+
+ if (sscanf(tmp, "%u", &busnum) != 1)
+ goto err;
+
+ asprintf(&name, "%s/%d-%s", busdev->path,
+ busnum, buspath);
+
+ free(tmp);
+ sysfs_close_bus(bus);
+
+ return name;
+ }
+
+err:
+ if (tmp)
+ free(tmp);
+ if (bus)
+ sysfs_close_bus(bus);
+ if (pcictl)
+ sysfs_close_device(pcictl);
+
+ return NULL;
+}
+
+void get_sysfs(char *fname)
+{
+ struct v4l2_driver drv;
+ char *path;
+ if (v4l2_open(fname, 0, &drv) < 0) {
+ perror(fname);
+ return;
+ }
+
+ printf("device = %s\n", fname);
+ printf("bus info = %s\n", drv.cap.bus_info);
+ path = obtain_bus_sysfs_path((char *)drv.cap.bus_info);
+ if (path) {
+ printf("sysfs path = %s\n\n", path);
+ free(path);
+ }
+
+ v4l2_close(&drv);
+}
+
+void read_dir(char *dirname)
+{
+ DIR *dir;
+ struct dirent *entry;
+ const char *vid = "video";
+ const char *rad = "radio";
+ char *p, name[512];
+
+ dir = opendir(dirname);
+ if (!dir)
+ return;
+
+ strcpy(name, dirname);
+ strcat(name, "/");
+ p = name + strlen(name);
+
+ entry = readdir(dir);
+ while (entry) {
+ if (!strncmp(entry->d_name, vid, strlen(vid)) ||
+ !strncmp(entry->d_name, rad, strlen(rad))) {
+ strcpy(p, entry->d_name);
+
+ get_sysfs(name);
+ }
+ entry = readdir(dir);
+ }
+ closedir(dir);
+}
+
+int main(void)
+{
+ read_dir("/dev");
+ return 0;
+}