#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include "videodev.h"
#include "videodev2.h"
#include "struct-dump.h"
#include "struct-v4l.h"
#include "struct-v4l2.h"
/* --------------------------------------------------------------------- */
/* v4l(1) */
static int dump_v4l(int fd, int tab)
{
struct video_capability capability;
struct video_channel channel;
struct video_tuner tuner;
struct video_audio audio;
struct video_picture picture;
struct video_buffer buffer;
struct video_window window;
unsigned int i;
printf("general info\n");
memset(&capability,0,sizeof(capability));
if (-1 == ioctl(fd,VIDIOCGCAP,&capability))
return -1;
printf(" VIDIOCGCAP\n");
print_struct(stdout,desc_video_capability,&capability,"",tab);
printf("\n");
printf("channels\n");
for (i = 0; i capability.channels; i++) {
memset(&channel,0,sizeof(channel));
channel.channel = i;
if (-1 == ioctl(fd,VIDIOCGCHAN,&channel)) {
perror("ioctl VIDIOCGCHAN");
continue;
}
printf(" VIDIOCGCHAN(%d)\n",i);
print_struct(stdout,desc_video_channel,&channel,"",tab);
}
printf("\n");
printf("tuner\n");
memset(&tuner,0,sizeof(tuner));
if (-1 == ioctl(fd,VIDIOCGTUNER,&tuner)) {
perror("ioctl VIDIOCGTUNER");
} else {
printf(" VIDIOCGTUNER\n");
print_struct(stdout,desc_video_tuner,&tuner,"",tab);
}
printf("\n");
printf("audio\n");
memset(&audio,0,sizeof(audio));
if (-1 == ioctl(fd,VIDIOCGAUDIO,&audio)) {
perror("ioctl VIDIOCGAUDIO");
} else {
printf(" VIDIOCGAUDIO\n");
print_struct(stdout,desc_video_audio,&audio,"",tab);
}
printf("\n");
printf("picture\n");
memset(&picture,0,sizeof(picture));
if (-1 == ioctl(fd,VIDIOCGPICT,&picture)) {
perror("ioctl VIDIOCGPICT");
} else {
printf(" VIDIOCGPICT\n");
print_struct(stdout,desc_video_picture,&picture,"",tab);
}
printf("\n");
printf("buffer\n");
memset(&buffer,0,sizeof(buffer));
if (-1 == ioctl(fd,VIDIOCGFBUF,&buffer)) {
perror("ioctl VIDIOCGFBUF");
} else {
printf(" VIDIOCGFBUF\n");
print_struct(stdout,desc_video_buffer,&buffer,"",tab);
}
printf("\n");
printf("window\n");
memset(&window,0,sizeof(window));
if (-1 == ioctl(fd,VIDIOCGWIN,&window)) {
perror("ioctl VIDIOCGWIN");
} else {
printf(" VIDIOCGWIN\n");
print_struct(stdout,desc_video_window,&window,"",tab);
}
printf("\n");
return 0;
}
/* --------------------------------------------------------------------- */
/* v4l2 */
static int dump_v4l2(int fd, int tab)
{
struct v4l2_capability capability;
struct v4l2_standard standard;
struct v4l2_input input;
struct v4l2_tuner tuner;
struct v4l2_fmtdesc fmtdesc;
struct v4l2_format format;
struct v4l2_framebuffer fbuf;
struct v4l2_queryctrl qctrl;
int i;
printf("general info\n");
memset(&capability,0,sizeof(capability));
if (-1 == ioctl(fd,VIDIOC_QUERYCAP,&capability))
return -1;
printf(" VIDIOC_QUERYCAP\n");
print_struct(stdout,desc_v4l2_capability,&capability,"",tab);
printf("\n");
printf("standards\n");
for (i = 0;; i++) {
memset(&standard,0,sizeof(standard));
standard.index = i;
if (-1 == ioctl(fd,VIDIOC_ENUMSTD,&standard))
break;
printf(" VIDIOC_ENUMSTD(%d)\n",i);
print_struct(stdout,desc_v4l2_standard,&standard,"",tab);
}
printf("\n");
printf("inputs\n");
for (i = 0;; i++) {
memset(&input,0,sizeof(input));
input.index = i;
if (-1 == ioctl(fd,VIDIOC_ENUMINPUT,&input))
break;
printf(" VIDIOC_ENUMINPUT(%d)\n",i);
print_struct(stdout,desc_v4l2_input,&input,"",tab);
}
printf("\n");
if (capability.capabilities & V4L2_CAP_TUNER) {
printf("tuners\n");
for (i = 0;; i++) {
memset(&tuner,0,sizeof(tuner));
tuner.index = i;
if (-1 == ioctl(fd,VIDIOC_G_TUNER,&tuner))
break;
printf(" VIDIOC_G_TUNER(%d)\n",i);
print_struct(stdout,desc_v4l2_tuner,&tuner,"",tab);
}
printf("\n");
}
if (capability.capabilities & V4L2_CAP_VIDEO_CAPTURE) {
printf("video capture\n");
for (i = 0;; i++) {
memset(&fmtdesc,0,sizeof(fmtdesc));
fmtdesc.index = i;
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc))
break;
printf(" VIDIOC_ENUM_FMT(%d,VIDEO_CAPTURE)\n",i);
print_struct(stdout,desc_v4l2_fmtdesc,&fmtdesc,"",tab);
}
memset(&format,0,sizeof(format));
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == ioctl(fd,VIDIOC_G_FMT,&format)) {
perror("VIDIOC_G_FMT(VIDEO_CAPTURE)");
} else {
printf(" VIDIOC_G_FMT(VIDEO_CAPTURE)\n");
print_struct(stdout,desc_v4l2_format,&format,"",tab);
}
printf("\n");
}
if (capability.capabilities & V4L2_CAP_VIDEO_OVERLAY) {
printf("video overlay\n");
for (i = 0;; i++) {
memset(&fmtdesc,0,sizeof(fmtdesc));
fmtdesc.index = i;
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
if (-1 == ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc))
break;
printf(" VIDIOC_ENUM_FMT(%d,VIDEO_OVERLAY)\n",i);
print_struct(stdout,desc_v4l2_fmtdesc,&fmtdesc,"",tab);
}
memset(&format,0,sizeof(format));
format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
if (-1 == ioctl(fd,VIDIOC_G_FMT,&format)) {
perror("VIDIOC_G_FMT(VIDEO_OVERLAY)");
} else {
printf(" VIDIOC_G_FMT(VIDEO_OVERLAY)\n");
print_struct(stdout,desc_v4l2_format,&format,"",tab);
}
memset(&fbuf,0,sizeof(fbuf));
if (-1 == ioctl(fd,VIDIOC_G_FBUF,&fbuf)) {
perror("VIDIOC_G_FBUF");
} else {
printf(" VIDIOC_G_FBUF\n");
print_struct(stdout,desc_v4l2_framebuffer,&fbuf,"",tab);
}
printf("\n");
}
if (capability.capabilities & V4L2_CAP_VBI_CAPTURE) {
printf("vbi capture\n");
for (i = 0;; i++) {
memset(&fmtdesc,0,sizeof(fmtdesc));
fmtdesc.index = i;
fmtdesc.type = V4L2_BUF_TYPE_VBI_CAPTURE;
if (-1 == ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc))
break;
printf(" VIDIOC_ENUM_FMT(%d,VBI_CAPTURE)\n",i);
print_struct(stdout,desc_v4l2_fmtdesc,&fmtdesc,"",tab);
}
memset(&format,0,sizeof(format));
format.type = V4L2_BUF_TYPE_VBI_CAPTURE;
if (-1 == ioctl(fd,VIDIOC_G_FMT,&format)) {
perror("VIDIOC_G_FMT(VBI_CAPTURE)");
} else {
printf(" VIDIOC_G_FMT(VBI_CAPTURE)\n");
print_struct(stdout,desc_v4l2_format,&format,"",tab);
}
printf("\n");
}
printf("controls\n");
for (i = 0;; i++) {
memset(&qctrl,0,sizeof(qctrl));
qctrl.id = V4L2_CID_BASE+i;
if (-1 == ioctl(fd,VIDIOC_QUERYCTRL,&qctrl))
break;
if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
printf(" VIDIOC_QUERYCTRL(BASE+%d)\n",i);
print_struct(stdout,desc_v4l2_queryctrl,&qctrl,"",tab);
}
for (i = 0;; i++) {
memset(&qctrl,0,sizeof(qctrl));
qctrl.id = V4L2_CID_PRIVATE_BASE+i;
if (-1 == ioctl(fd,VIDIOC_QUERYCTRL,&qctrl))
break;
if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
printf(" VIDIOC_QUERYCTRL(PRIVATE_BASE+%d)\n",i);
print_struct(stdout,desc_v4l2_queryctrl,&qctrl,"",tab);
}
return 0;
}
/* --------------------------------------------------------------------- */
/* main */
int main(int argc, char *argv[])
{
char dummy[256];
char *device = "/dev/video0";
int tab = 1, ok = 0;
int fd;
if (argc > 1)
device = argv[1];
fd = open(device,O_RDONLY);
if (-1 == fd) {
fprintf(stderr,"open %s: %s\n",device,strerror(errno));
exit(1);
};
if (-1 != ioctl(fd,VIDIOC_QUERYCAP,dummy)) {
printf("\n### v4l2 device info [%s] ###\n",device);
dump_v4l2(fd,tab);
ok = 1;
}
if (-1 != ioctl(fd,VIDIOCGCAP,dummy)) {
printf("\n### video4linux device info [%s] ###\n",device);
dump_v4l(fd,tab);
ok = 1;
}
if (!ok) {
fprintf(stderr,"%s: not an video4linux device\n",device);
exit(1);
}
return 0;
}
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
代码来源:http://read.pudn.com/downloads142/sourcecode/others/617367/xawtv_3.91/xawtv-3.91/console/v4l-info.c__.htm