@@ -63,6 +63,7 @@ struct buffer
struct device
{
int fd;
+ int opened;
int type; /* buffer queue type */
enum v4l2_memory memtype;
@@ -222,11 +223,6 @@ static const char *v4l2_format_name(unsigned int fourcc)
static int video_open(struct device *dev, const char *devname)
{
- dev->fd = -1;
- dev->memtype = V4L2_MEMORY_MMAP;
- dev->buffers = NULL;
- dev->type = (enum v4l2_buf_type)-1;
-
dev->fd = open(devname, O_RDWR);
if (dev->fd < 0) {
printf("Error opening device %s: %s (%d).\n", devname,
@@ -236,6 +232,8 @@ static int video_open(struct device *dev, const char *devname)
printf("Device %s opened.\n", devname);
+ dev->opened = 1;
+
return 0;
}
@@ -287,7 +285,8 @@ static void video_close(struct device *dev)
free(dev->pattern[i]);
free(dev->buffers);
- close(dev->fd);
+ if (dev->opened)
+ close(dev->fd);
}
static unsigned int get_control_type(struct device *dev, unsigned int id)
@@ -1513,6 +1512,7 @@ static void usage(const char *argv0)
printf("-w, --set-control 'ctrl value' Set control 'ctrl' to 'value'\n");
printf(" --enum-formats Enumerate formats\n");
printf(" --enum-inputs Enumerate inputs\n");
+ printf(" --fd Use a numeric file descriptor insted of a device\n");
printf(" --no-query Don't query capabilities on open\n");
printf(" --offset User pointer buffer offset from page start\n");
printf(" --requeue-last Requeue the last buffers before streamoff\n");
@@ -1529,6 +1529,7 @@ static void usage(const char *argv0)
#define OPT_USERPTR_OFFSET 261
#define OPT_REQUEUE_LAST 262
#define OPT_STRIDE 263
+#define OPT_FD 264
static struct option opts[] = {
{"capture", 2, 0, 'c'},
@@ -1536,6 +1537,7 @@ static struct option opts[] = {
{"delay", 1, 0, 'd'},
{"enum-formats", 0, 0, OPT_ENUM_FORMATS},
{"enum-inputs", 0, 0, OPT_ENUM_INPUTS},
+ {"fd", 1, 0, OPT_FD},
{"file", 2, 0, 'F'},
{"fill-frames", 0, 0, 'I'},
{"format", 1, 0, 'f'},
@@ -1564,7 +1566,11 @@ static struct option opts[] = {
int main(int argc, char *argv[])
{
struct sched_param sched;
- struct device dev = { .type = -1 };
+ struct device dev = {
+ .fd = -1,
+ .memtype = V4L2_MEMORY_MMAP,
+ .type = -1,
+ };
int ret;
/* Options parsings */
@@ -1728,6 +1734,14 @@ int main(int argc, char *argv[])
case OPT_ENUM_INPUTS:
do_enum_inputs = 1;
break;
+ case OPT_FD:
+ dev.fd = atoi(optarg);
+ if (dev.fd < 0) {
+ printf("Bad file descriptor %d\n", dev.fd);
+ return 1;
+ }
+ printf("Using file descriptor %d\n", dev.fd);
+ break;
case OPT_NO_QUERY:
no_query = 1;
break;
@@ -1758,17 +1772,19 @@ int main(int argc, char *argv[])
return 1;
}
- if (optind >= argc) {
- usage(argv[0]);
- return 1;
- }
-
if (!do_file)
filename = NULL;
- ret = video_open(&dev, argv[optind]);
- if (ret < 0)
- return 1;
+ if (dev.fd == -1) {
+ if (optind >= argc) {
+ usage(argv[0]);
+ return 1;
+ } else {
+ ret = video_open(&dev, argv[optind]);
+ if (ret < 0)
+ return 1;
+ }
+ }
if (!no_query) {
ret = video_querycap(&dev, &capabilities);
Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi> --- yavta.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-)