1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*
# (C) 2008 Hans de Goede <hdegoede@redhat.com>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include "../libv4lconvert/libv4lsyscall-priv.h"
#include "libv4l1-videodev.h"
#include "libv4l1-priv.h"
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
FILE *v4l1_log_file = NULL;
static const char *v4l1_ioctls[] = {
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
[_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
[_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
[_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
[_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
[_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
[_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
[_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
[_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
[_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
[_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
[_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
[_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
[_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
[_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
[_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
[_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
[_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
[_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
[_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT",
};
void v4l1_log_ioctl(unsigned long int request, void *arg, int result)
{
const char *ioctl_str = "unknown";
char buf[40];
if (!v4l1_log_file)
return;
/* Don't log v4l2 ioctl's as unknown we pass them to libv4l2 which will
log them for us */
if (_IOC_TYPE(request) == 'V')
return;
if (_IOC_TYPE(request) == 'v' && _IOC_NR(request) < ARRAY_SIZE(v4l1_ioctls))
ioctl_str = v4l1_ioctls[_IOC_NR(request)];
else {
snprintf(buf, sizeof(buf), "unknown request: %c %d\n",
(int)_IOC_TYPE(request), (int)_IOC_NR(request));
ioctl_str = buf;
}
fprintf(v4l1_log_file, "request == %s\n", ioctl_str);
switch (request) {
case VIDIOCGCAP:
fprintf(v4l1_log_file, "name %s\n", ((struct video_capability *)arg)->name);
fprintf(v4l1_log_file, "type %d\n", ((struct video_capability *)arg)->type);
fprintf(v4l1_log_file, "channels %d\n", ((struct video_capability *)arg)->channels);
fprintf(v4l1_log_file, "audios %d\n", ((struct video_capability *)arg)->audios);
fprintf(v4l1_log_file, "maxwidth %d\n", ((struct video_capability *)arg)->maxwidth);
fprintf(v4l1_log_file, "maxheight %d\n", ((struct video_capability *)arg)->maxheight);
fprintf(v4l1_log_file, "minwidth %d\n", ((struct video_capability *)arg)->minwidth);
fprintf(v4l1_log_file, "minheight %d\n", ((struct video_capability *)arg)->minheight);
break;
case VIDIOCGWIN:
case VIDIOCSWIN:
fprintf(v4l1_log_file, "width %u\n",
((struct video_window *)arg)->width);
fprintf(v4l1_log_file, "height %u\n",
((struct video_window *)arg)->height);
break;
case VIDIOCGCHAN:
case VIDIOCSCHAN:
fprintf(v4l1_log_file, "channel %d\n", ((struct video_channel *)arg)->channel);
fprintf(v4l1_log_file, "name %s\n", ((struct video_channel *)arg)->name);
break;
case VIDIOCGPICT:
case VIDIOCSPICT:
fprintf(v4l1_log_file, "brightness %d\n", ((int)((struct video_picture *)arg)->brightness));
fprintf(v4l1_log_file, "hue %d\n", ((int)((struct video_picture *)arg)->hue));
fprintf(v4l1_log_file, "colour %d\n", ((int)((struct video_picture *)arg)->colour));
fprintf(v4l1_log_file, "contrast %d\n", ((int)((struct video_picture *)arg)->contrast));
fprintf(v4l1_log_file, "whiteness %d\n", ((int)((struct video_picture *)arg)->whiteness));
fprintf(v4l1_log_file, "depth %d\n", ((int)((struct video_picture *)arg)->depth));
fprintf(v4l1_log_file, "palette %d\n", ((int)((struct video_picture *)arg)->palette));
break;
case VIDIOCCAPTURE:
fprintf(v4l1_log_file, "on/off? %d\n", *((int *)arg));
break;
case VIDIOCSYNC:
fprintf(v4l1_log_file, "sync %d\n", *((int *)arg));
break;
case VIDIOCMCAPTURE:
fprintf(v4l1_log_file, "frame %u\n", ((struct video_mmap *)arg)->frame);
fprintf(v4l1_log_file, "width %d\n", ((struct video_mmap *)arg)->width);
fprintf(v4l1_log_file, "height %d\n", ((struct video_mmap *)arg)->height);
fprintf(v4l1_log_file, "format %u\n", ((struct video_mmap *)arg)->format);
break;
case VIDIOCGMBUF:
fprintf(v4l1_log_file, "size %d\n", ((struct video_mbuf *)arg)->size);
fprintf(v4l1_log_file, "frames %d\n", ((struct video_mbuf *)arg)->frames);
break;
}
fprintf(v4l1_log_file, "result == %d\n", result);
fflush(v4l1_log_file);
}
|