From 177e0e5c4b54622c9c479558aa3e4a901bac7386 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sun, 23 Dec 2001 15:25:57 +0000 Subject: [PATCH] Byebye old plugins Original commit message from CVS: Byebye old plugins --- sys/v4l/grab-v4l.c | 973 --------------------------------------------- sys/v4l/grab.h | 121 ------ 2 files changed, 1094 deletions(-) delete mode 100644 sys/v4l/grab-v4l.c delete mode 100644 sys/v4l/grab.h diff --git a/sys/v4l/grab-v4l.c b/sys/v4l/grab-v4l.c deleted file mode 100644 index 6c059501d8..0000000000 --- a/sys/v4l/grab-v4l.c +++ /dev/null @@ -1,973 +0,0 @@ -/* - * interface to the v4l driver - * - * (c) 1997-99 Gerd Knorr - * - */ -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include /* XXX glibc */ -#include - -#include "grab.h" - -#define SYNC_TIMEOUT 1 - -/* ---------------------------------------------------------------------- */ - -/* experimental, interface might change */ -#ifndef VIDIOCSWIN2 -#define VIDIOCSWIN2 _IOW('v',28,struct video_window2) -struct video_window2 -{ - __u16 palette; /* Palette (aka video format) in use */ - __u32 start; /* start address, relative to video_buffer.base */ - __u32 pitch; - __u32 width; - __u32 height; - __u32 flags; - - struct video_clip *clips; - int clipcount; -}; -#endif - -/* ---------------------------------------------------------------------- */ - -/* open+close */ -static int grab_open(struct GRABBER *grab_v4l, char *filename); -static int grab_close(struct GRABBER *grab_v4l); - -/* overlay */ -static int grab_setupfb(struct GRABBER *grab_v4l, int sw, int sh, int format, void *base, int width); -static int grab_overlay(struct GRABBER *grab_v4l, int x, int y, int width, int height, int format, - OverlayClip *oc, int count); -static int grab_offscreen(struct GRABBER *grab_v4l, int start, int pitch, int width, int height, - int format); - -/* capture */ -static int grab_mm_setparams(struct GRABBER *grab_v4l, int format, int *width, int *height, - int *linelength); -static void* grab_mm_capture(struct GRABBER *grab_v4l, int single); -static void grab_mm_cleanup(struct GRABBER *grab_v4l); -static int grab_read_setparams(struct GRABBER *grab_v4l, int format, int *width, int *height, - int *linelength); -static void* grab_read_capture(struct GRABBER *grab_v4l, int single); -static void grab_read_cleanup(struct GRABBER *grab_v4l); - -/* control */ -static int grab_tune(struct GRABBER *grab_v4l, unsigned long freq); -static int grab_tuned(struct GRABBER *grab_v4l); -static int grab_input(struct GRABBER *grab_v4l, int input, int norm); -static int grab_hasattr(struct GRABBER *grab_v4l, int id); -static int grab_getattr(struct GRABBER *grab_v4l, int id); -static int grab_setattr(struct GRABBER *grab_v4l, int id, int val); - -/* internal helpers */ -static int grab_wait(struct GRABBER *grab_v4l, struct video_mmap *gb); - -/* ---------------------------------------------------------------------- */ - -static const char *device_cap[] = { - "capture", "tuner", "teletext", "overlay", "chromakey", "clipping", - "frameram", "scales", "monochrome", NULL -}; - -static const char *device_pal[] = { - "-", "grey", "hi240", "rgb16", "rgb24", "rgb32", "rgb15", - "yuv422", "yuyv", "uyvy", "yuv420", "yuv411", "raw", - "yuv422p", "yuv411p", "yuv420p", "yuv410p" -}; -#define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN") - -static const struct STRTAB stereo[] = { - { 0, "auto" }, - { 1, "mono" }, - { 2, "stereo" }, - { 4, "lang1" }, - { 8, "lang2" }, - { -1, NULL, }, - }; -static struct STRTAB norms[] = { - { 0, "PAL" }, - { 1, "NTSC" }, - { 2, "SECAM" }, - { 3, "AUTO" }, - { -1, NULL } - }; -static const struct STRTAB norms_bttv[] = { - { 0, "PAL" }, - { 1, "NTSC" }, - { 2, "SECAM" }, - { 3, "PAL-NC" }, - { 4, "PAL-M" }, - { 5, "PAL-N" }, - { 6, "NTSC-JP" }, - { -1, NULL } - }; -static int gb_pal[] = { - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -static const unsigned short format2palette[] = { - 0,/* unused */ - VIDEO_PALETTE_HI240,/* RGB8 */ - VIDEO_PALETTE_GREY,/* GRAY8 */ -#if __BYTE_ORDER == __BIG_ENDIAN - 0, - 0, - VIDEO_PALETTE_RGB555,/* RGB15_BE */ - VIDEO_PALETTE_RGB565,/* RGB16_BE */ - 0, - 0, - VIDEO_PALETTE_RGB24,/* RGB24 */ - VIDEO_PALETTE_RGB32,/* RGB32 */ -#else - VIDEO_PALETTE_RGB555,/* RGB15_LE */ - VIDEO_PALETTE_RGB565,/* RGB16_LE */ - 0, - 0, - VIDEO_PALETTE_RGB24,/* BGR24 */ - VIDEO_PALETTE_RGB32,/* BGR32 */ - 0, - 0, -#endif - 0, /* LUT 2 */ - 0, /* LUT 4 */ - VIDEO_PALETTE_YUV422, /* YUV422 */ - VIDEO_PALETTE_YUV422P, /* YUV422P */ - VIDEO_PALETTE_YUV420P, /* YUV420P */ -}; - -static const unsigned int format2depth[] = { - 0, /* unused */ - 8, /* RGB8 */ - 8, /* GRAY8 */ - 16, /* RGB15 LE */ - 16, /* RGB16 LE */ - 16, /* RGB15 BE */ - 16, /* RGB16 BE */ - 24, /* BGR24 */ - 32, /* BGR32 */ - 24, /* RGB24 */ - 32, /* RGB32 */ - 16, /* LUT2 */ - 32, /* LUT4 */ - 16, /* YUV422 */ - 16, /* YUV422P */ - 12, /* YUV420P */ - 0, /* MJPEG */ -}; - -static const unsigned char* format_desc[] = { - "", - "8 bit PseudoColor (dithering)", - "8 bit StaticGray", - "15 bit TrueColor (LE)", - "16 bit TrueColor (LE)", - "15 bit TrueColor (BE)", - "16 bit TrueColor (BE)", - "24 bit TrueColor (LE: bgr)", - "32 bit TrueColor (LE: bgr-)", - "24 bit TrueColor (BE: rgb)", - "32 bit TrueColor (BE: -rgb)", - "16 bit TrueColor (lut)", - "32 bit TrueColor (lut)", - "16 bit YUV 4:2:2", - "16 bit YUV 4:2:2 (planar)", - "12 bit YUV 4:2:0 (planar)", - "MJPEG" -}; - - -/* pass 0/1 by reference */ -static const int one = 1, zero = 0; - -/* ---------------------------------------------------------------------- */ -static const struct GRAB_ATTR init_grab_attr[] = - { - { GRAB_ATTR_VOLUME, 1, VIDIOCGAUDIO, VIDIOCSAUDIO, NULL }, - { GRAB_ATTR_MUTE, 1, VIDIOCGAUDIO, VIDIOCSAUDIO, NULL }, - { GRAB_ATTR_MODE, 1, VIDIOCGAUDIO, VIDIOCSAUDIO, NULL }, - - { GRAB_ATTR_COLOR, 1, VIDIOCGPICT, VIDIOCSPICT, NULL }, - { GRAB_ATTR_BRIGHT, 1, VIDIOCGPICT, VIDIOCSPICT, NULL }, - { GRAB_ATTR_HUE, 1, VIDIOCGPICT, VIDIOCSPICT, NULL }, - { GRAB_ATTR_CONTRAST, 1, VIDIOCGPICT, VIDIOCSPICT, NULL }, - }; - -struct GRABBER *grab_init() -{ - struct GRABBER *new_grabber; - - new_grabber = malloc(sizeof(struct GRABBER)); - - new_grabber->name = "v4l"; - new_grabber->flags = 0; - new_grabber->norms = norms; - new_grabber->inputs = NULL; - new_grabber->opened = 0; - new_grabber->fd = -1; - new_grabber->overlay = 0; - new_grabber->audio_modes = stereo; - new_grabber->grab_open = grab_open; - new_grabber->grab_close = grab_close; - new_grabber->grab_setupfb = grab_setupfb; - new_grabber->grab_overlay = NULL; - new_grabber->grab_offscreen = NULL; - new_grabber->grab_setparams = NULL; - new_grabber->grab_capture = NULL; - new_grabber->grab_cleanup = NULL; - new_grabber->grab_tune = grab_tune; - new_grabber->grab_tuned = grab_tuned; - new_grabber->grab_input = grab_input; - new_grabber->grab_hasattr = grab_hasattr; - new_grabber->grab_getattr = grab_getattr; - new_grabber->grab_setattr = grab_setattr; - - memcpy(new_grabber->grab_attr, init_grab_attr, sizeof(init_grab_attr)); - - new_grabber->grab_attr[0].arg = &new_grabber->audio; - new_grabber->grab_attr[1].arg = &new_grabber->audio; - new_grabber->grab_attr[2].arg = &new_grabber->audio; - new_grabber->grab_attr[3].arg = &new_grabber->pict; - new_grabber->grab_attr[4].arg = &new_grabber->pict; - new_grabber->grab_attr[5].arg = &new_grabber->pict; - new_grabber->grab_attr[6].arg = &new_grabber->pict; - - return new_grabber; -} - -/* FIXME this isn't used (yet?) -static void grab_cleanup(struct GRABBER *grab_v4l) -{ -} -*/ - -static int grab_open(struct GRABBER *grab_v4l, char *filename) -{ - int i; - - if (-1 != grab_v4l->fd) - goto err; - - if (-1 == (grab_v4l->fd = open(filename ? filename : "/dev/video",O_RDWR))) { - fprintf(stderr,"v4l: open %s: %s\n", - filename ? filename : "/dev/video",strerror(errno)); - goto err; - } - - if (-1 == ioctl(grab_v4l->fd,VIDIOCGCAP,&grab_v4l->capability)) { - perror("v4l: open\n"); - goto err; - } - - fprintf(stderr, "v4l: open\n"); - - fcntl(grab_v4l->fd,F_SETFD,FD_CLOEXEC); - - fprintf(stderr,"v4l: device is %s\n",grab_v4l->capability.name); - - sprintf(grab_v4l->name = malloc(strlen(grab_v4l->capability.name)+8), - "v4l: %s",grab_v4l->capability.name); - - fprintf(stderr,"v4l: capabilities: "); - for (i = 0; device_cap[i] != NULL; i++) - if (grab_v4l->capability.type & (1 << i)) - fprintf(stderr," %s",device_cap[i]); - fprintf(stderr,"\n"); - - /* input sources */ - fprintf(stderr,"v4l: channels: %d\n",grab_v4l->capability.channels); - - grab_v4l->channels = malloc(sizeof(struct video_channel)*grab_v4l->capability.channels); - memset(grab_v4l->channels,0,sizeof(struct video_channel)*grab_v4l->capability.channels); - - grab_v4l->inputs = malloc(sizeof(struct STRTAB)*(grab_v4l->capability.channels+1)); - memset(grab_v4l->inputs,0,sizeof(struct STRTAB)*(grab_v4l->capability.channels+1)); - - for (i = 0; i < grab_v4l->capability.channels; i++) { - grab_v4l->channels[i].channel = i; - if (-1 == ioctl(grab_v4l->fd,VIDIOCGCHAN,&grab_v4l->channels[i])) - perror("v4l: ioctl VIDIOCGCHAN"), exit(0); - grab_v4l->inputs[i].nr = i; - grab_v4l->inputs[i].str = grab_v4l->channels[i].name; - fprintf(stderr,"v4l: %s: %d %s%s %s%s\n", - grab_v4l->channels[i].name, - grab_v4l->channels[i].tuners, - (grab_v4l->channels[i].flags & VIDEO_VC_TUNER) ? "tuner " : "", - (grab_v4l->channels[i].flags & VIDEO_VC_AUDIO) ? "audio " : "", - (grab_v4l->channels[i].type & VIDEO_TYPE_TV) ? "tv " : "", - (grab_v4l->channels[i].type & VIDEO_TYPE_CAMERA) ? "camera " : ""); - } - grab_v4l->inputs[i].nr = -1; - grab_v4l->inputs[i].str = NULL; - - /* ioctl probe, switch to input 0 */ - if (-1 == ioctl(grab_v4l->fd,VIDIOCSCHAN,&grab_v4l->channels[0])) { - fprintf(stderr,"v4l: you need a newer bttv version (>= 0.5.14)\n"); - goto err; - } - - /* audios */ - fprintf(stderr,"v4l: audios : %d\n",grab_v4l->capability.audios); - - if (grab_v4l->capability.audios) { - grab_v4l->audio.audio = 0; - if (-1 == ioctl(grab_v4l->fd,VIDIOCGAUDIO,&grab_v4l->audio)) - perror("v4l: ioctl VIDIOCGCAUDIO") /* , exit(0) */ ; - fprintf(stderr,"v4l: %d (%s): ",i,grab_v4l->audio.name); - if (grab_v4l->audio.flags & VIDEO_AUDIO_MUTABLE) - fprintf(stderr,"muted=%s ", - (grab_v4l->audio.flags&VIDEO_AUDIO_MUTE) ? "yes":"no"); - if (grab_v4l->audio.flags & VIDEO_AUDIO_VOLUME) - fprintf(stderr,"volume=%d ",grab_v4l->audio.volume); - if (grab_v4l->audio.flags & VIDEO_AUDIO_BASS) - fprintf(stderr,"bass=%d ",grab_v4l->audio.bass); - if (grab_v4l->audio.flags & VIDEO_AUDIO_TREBLE) - fprintf(stderr,"treble=%d ",grab_v4l->audio.treble); - fprintf(stderr,"\n"); - - if (!(grab_v4l->audio.flags & VIDEO_AUDIO_VOLUME)) { - grab_v4l->grab_attr[0].have = 0; /* volume */ - } - } else { - grab_v4l->grab_attr[0].have = 0; /* volume */ - grab_v4l->grab_attr[1].have = 0; /* mute */ - grab_v4l->grab_attr[2].have = 0; /* audio mode */ - } - - fprintf(stderr,"v4l: size : %dx%d => %dx%d\n", - grab_v4l->capability.minwidth,grab_v4l->capability.minheight, - grab_v4l->capability.maxwidth,grab_v4l->capability.maxheight); - - /* tuner (more than one???) */ - if (grab_v4l->capability.type & VID_TYPE_TUNER) { - grab_v4l->tuner = malloc(sizeof(struct video_tuner)); - memset(grab_v4l->tuner,0,sizeof(struct video_tuner)); - if (-1 == ioctl(grab_v4l->fd,VIDIOCGTUNER,grab_v4l->tuner)) - perror("v4l: ioctl VIDIOCGTUNER"); - fprintf(stderr,"v4l: tuner : %s %lu-%lu", - grab_v4l->tuner->name,grab_v4l->tuner->rangelow,grab_v4l->tuner->rangehigh); - for (i = 0; norms[i].str != NULL; i++) { - if (grab_v4l->tuner->flags & (1<channels[0], sizeof(struct video_channel)); - for (i = 0; norms[i].str != NULL; i++) { - vchan.norm = i; - if (-1 == ioctl(grab_v4l->fd,VIDIOCSCHAN,&vchan)) - norms[i].nr = -1; - fprintf(stderr," %s",norms[i].str); - } - fprintf(stderr,"\n"); - if (-1 == ioctl(grab_v4l->fd,VIDIOCSCHAN,&grab_v4l->channels[0])) { - fprintf(stderr,"v4l: you need a newer bttv version (>= 0.5.14)\n"); - goto err; - } - grab_v4l->grab_tune = NULL; - grab_v4l->grab_tuned = NULL; - } -#if 1 -#define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int) - /* dirty hack time / v4l design flaw -- works with bttv only - * this adds support for a few less common PAL versions */ - if (-1 != ioctl(grab_v4l->fd,BTTV_VERSION,0)) { - grab_v4l->norms = norms_bttv; - } -#endif - - /* frame buffer */ - if (-1 == ioctl(grab_v4l->fd,VIDIOCGFBUF,&grab_v4l->ov_fbuf)) - perror("v4l: ioctl VIDIOCGFBUF"); - fprintf(stderr,"v4l: fbuffer : base=0x%p size=%dx%d depth=%d bpl=%d\n", - grab_v4l->ov_fbuf.base, grab_v4l->ov_fbuf.width, grab_v4l->ov_fbuf.height, - grab_v4l->ov_fbuf.depth, grab_v4l->ov_fbuf.bytesperline); - - /* picture parameters */ - if (-1 == ioctl(grab_v4l->fd,VIDIOCGPICT,&grab_v4l->pict)) - perror("v4l: ioctl VIDIOCGPICT"); - - fprintf(stderr, - "v4l: picture : brightness=%d hue=%d colour=%d contrast=%d\n", - grab_v4l->pict.brightness, grab_v4l->pict.hue, grab_v4l->pict.colour, grab_v4l->pict.contrast); - fprintf(stderr, - "v4l: picture : whiteness=%d depth=%d palette=%s\n", - grab_v4l->pict.whiteness, grab_v4l->pict.depth, PALETTE(grab_v4l->pict.palette)); - - /* map grab buffer */ - if (-1 == ioctl(grab_v4l->fd,VIDIOCGMBUF,&grab_v4l->gb_buffers)) { - perror("v4l: ioctl VIDIOCGMBUF"); - } - grab_v4l->map = mmap(0,grab_v4l->gb_buffers.size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_v4l->fd,0); - if ((char*)-1 != grab_v4l->map) { - grab_v4l->grab_setparams = grab_mm_setparams; - grab_v4l->grab_capture = grab_mm_capture; - grab_v4l->grab_cleanup = grab_mm_cleanup; - } else { - perror("v4l: mmap"); - grab_v4l->grab_setparams = grab_read_setparams; - grab_v4l->grab_capture = grab_read_capture; - grab_v4l->grab_cleanup = grab_read_cleanup; - } - grab_v4l->opened = 1; - - return grab_v4l->fd; - - err: - if (grab_v4l->fd != -1) { - close(grab_v4l->fd); - grab_v4l->fd = -1; - } - return -1; -} - -static int - grab_close(struct GRABBER *grab_v4l) -{ - if (-1 == grab_v4l->fd) - return 0; - - if (grab_v4l->gb_grab > grab_v4l->gb_sync) - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd); - - if ((char*)-1 != grab_v4l->map) - munmap(grab_v4l->map,grab_v4l->gb_buffers.size); - - fprintf(stderr, "v4l: close\n"); - - close(grab_v4l->fd); - grab_v4l->fd = -1; - grab_v4l->opened = 0; - return 0; -} - -/* ---------------------------------------------------------------------- */ -/* do overlay */ - -static int - grab_setupfb(struct GRABBER *grab_v4l, int sw, int sh, int format, void *base, int bpl) -{ - int settings_ok = 1; - grab_v4l->swidth = sw; - grab_v4l->sheight = sh; - - /* double-check settings */ - fprintf(stderr,"v4l: %dx%d, %d bit/pixel, %d byte/scanline\n", - grab_v4l->ov_fbuf.width,grab_v4l->ov_fbuf.height, - grab_v4l->ov_fbuf.depth,grab_v4l->ov_fbuf.bytesperline); - if ((bpl > 0 && grab_v4l->ov_fbuf.bytesperline != bpl) || - (grab_v4l->ov_fbuf.width != sw) || - (grab_v4l->ov_fbuf.height != sh)) { - fprintf(stderr,"v4l: WARNING: v4l and dga disagree about the screen size\n"); - fprintf(stderr,"v4l: WARNING: Is v4l-conf installed correctly?\n"); - settings_ok = 0; - } - if (format2depth[format] != ((grab_v4l->ov_fbuf.depth+7)&0xf8)) { - fprintf(stderr,"v4l: WARNING: v4l and dga disagree about the color depth\n"); - fprintf(stderr,"v4l: WARNING: Is v4l-conf installed correctly?\n"); - fprintf(stderr,"%d %d\n",format2depth[format],grab_v4l->ov_fbuf.depth); - settings_ok = 0; - } - if (settings_ok) { - grab_v4l->grab_overlay = grab_overlay; - grab_v4l->grab_offscreen = grab_offscreen; - return 0; - } else { - fprintf(stderr,"v4l: WARNING: overlay mode disabled\n"); - return -1; - } -} - -static int - grab_overlay(struct GRABBER *grab_v4l, int x, int y, int width, int height, int format, - OverlayClip *oc, int count) - { - int i,xadjust=0,yadjust=0; - - //fprintf(stderr,"v4l: overlay %d %d\n", x, y); - - if (width == 0 || height == 0) { - //fprintf(stderr,"v4l: overlay off\n"); - ioctl(grab_v4l->fd, VIDIOCCAPTURE, &zero); - grab_v4l->overlay = 0; - return 0; - } - - grab_v4l->ov_win.x = x; - grab_v4l->ov_win.y = y; - grab_v4l->ov_win.width = width; - grab_v4l->ov_win.height = height; - grab_v4l->ov_win.flags = 0; - - /* check against max. size */ - ioctl(grab_v4l->fd,VIDIOCGCAP,&grab_v4l->capability); - if (grab_v4l->ov_win.width > grab_v4l->capability.maxwidth) { - grab_v4l->ov_win.width = grab_v4l->capability.maxwidth; - grab_v4l->ov_win.x += (width - grab_v4l->ov_win.width)/2; - } - if (grab_v4l->ov_win.height > grab_v4l->capability.maxheight) { - grab_v4l->ov_win.height = grab_v4l->capability.maxheight; - grab_v4l->ov_win.y += (height - grab_v4l->ov_win.height)/2; - } - - /* pass aligned values -- the driver does'nt get it right yet */ - grab_v4l->ov_win.width &= ~3; - grab_v4l->ov_win.height &= ~3; - grab_v4l->ov_win.x &= ~3; - if (grab_v4l->ov_win.x < x) grab_v4l->ov_win.x += 4; - if (grab_v4l->ov_win.x+grab_v4l->ov_win.width > x+width) grab_v4l->ov_win.width -= 4; - - /* fixups */ - xadjust = grab_v4l->ov_win.x - x; - yadjust = grab_v4l->ov_win.y - y; - - if (grab_v4l->capability.type & VID_TYPE_CLIPPING) { - grab_v4l->ov_win.clips = grab_v4l->ov_clips; - grab_v4l->ov_win.clipcount = count; - - for (i = 0; i < count; i++) { - grab_v4l->ov_clips[i].x = oc[i].x1 - xadjust; - grab_v4l->ov_clips[i].y = oc[i].y1 - yadjust; - grab_v4l->ov_clips[i].width = oc[i].x2-oc[i].x1 /* XXX */; - grab_v4l->ov_clips[i].height = oc[i].y2-oc[i].y1; - //fprintf(stderr,"v4l: clip=%dx%d+%d+%d\n", - //grab_v4l->ov_clips[i].width,grab_v4l->ov_clips[i].height, - //grab_v4l->ov_clips[i].x,grab_v4l->ov_clips[i].y); - } - } - if (grab_v4l->capability.type & VID_TYPE_CHROMAKEY) { - grab_v4l->ov_win.chromakey = 0; /* XXX */ - } - if (-1 == ioctl(grab_v4l->fd, VIDIOCSWIN, &grab_v4l->ov_win)) - perror("v4l: ioctl VIDIOCSWIN"); - - if (!grab_v4l->overlay) { - grab_v4l->pict.palette = - (format < sizeof(format2palette)/sizeof(unsigned short))? - format2palette[format]: 0; - if(grab_v4l->pict.palette == 0) { - fprintf(stderr,"v4l: unsupported overlay video format: %s\n", - format_desc[format]); - return -1; - } - if (-1 == ioctl(grab_v4l->fd,VIDIOCSPICT,&grab_v4l->pict)) - perror("v4l: ioctl VIDIOCSPICT"); - if (-1 == ioctl(grab_v4l->fd, VIDIOCCAPTURE, &one)) - perror("v4l: ioctl VIDIOCCAPTURE"); - grab_v4l->overlay = 1; - } - - //fprintf(stderr,"v4l: overlay win=%dx%d+%d+%d, %d clips\n", - // width,height,x,y, count); - - return 0; - } - -static int - grab_offscreen(struct GRABBER *grab_v4l, int start, int pitch, int width, int height, int format) -{ - struct video_window2 vo; - - if (width == 0 || height == 0) { - fprintf(stderr,"v4l: offscreen off\n"); - ioctl(grab_v4l->fd, VIDIOCCAPTURE, &zero); - grab_v4l->overlay = 0; - return 0; - } - - vo.palette = VIDEO_PALETTE_YUV422; /* FIXME */ - vo.start = start; - vo.pitch = pitch; - vo.width = width; - vo.height = height; - vo.flags = 0; - vo.clips = NULL; - vo.clipcount = 0; - - if (-1 == ioctl(grab_v4l->fd_grab,VIDIOCSWIN2,&vo)) - perror("v4l: ioctl VIDIOCSOFFSCREEN"); - if (-1 == ioctl(grab_v4l->fd_grab,VIDIOCCAPTURE,&one)) - perror("v4l: ioctl VIDIOCCAPTURE"); - fprintf(stderr,"v4l: offscreen size=%dx%d\n", - width,height); - return 0; -} - -/* ---------------------------------------------------------------------- */ -/* capture using mmaped buffers (with double-buffering, ...) */ - -static int - grab_queue(struct GRABBER *grab_v4l, struct video_mmap *gb, int probe) -{ - //fprintf(stderr,"g%d",gb->frame); -#if 0 - /* might be useful for debugging driver problems */ - memset(map + grab_v4l->gb_buffers.offsets[gb->frame],0, - grab_v4l->gb_buffers.size/grab_v4l->gb_buffers.frames); -#endif - if (-1 == ioctl(grab_v4l->fd,VIDIOCMCAPTURE,gb)) { - if (errno == EAGAIN) - fprintf(stderr,"v4l: grabber chip can't sync (no station tuned in?)\n"); - else - if (!probe) - fprintf(stderr,"v4l: ioctl VIDIOCMCAPTURE(%d,%s,%dx%d): %s\n", - gb->frame,PALETTE(gb->format),gb->width,gb->height, - strerror(errno)); - return -1; - } - //fprintf(stderr,"* "); - grab_v4l->gb_grab++; - return 0; -} - -static int - grab_wait(struct GRABBER *grab_v4l, struct video_mmap *gb) -{ - int ret = 0; - - //alarm(SYNC_TIMEOUT); - //fprintf(stderr,"s%d",gb->frame); - - if (-1 == ioctl(grab_v4l->fd,VIDIOCSYNC,&(gb->frame))) { - //perror("v4l: ioctl VIDIOCSYNC"); - ret = -1; - } - grab_v4l->gb_sync++; - //fprintf(stderr,"* "); - //alarm(0); - return ret; -} - -static int - grab_probe(struct GRABBER *grab_v4l, int format) -{ - struct video_mmap gb; - - if (0 != gb_pal[format]) - goto done; - - gb.frame = 0; - gb.width = 64; - gb.height = 48; - - fprintf(stderr, "v4l: capture probe %s...\t", device_pal[format]); - gb.format = format; - if (-1 == grab_queue(grab_v4l, &gb,1)) { - gb_pal[format] = 2; - goto done; - } - if (-1 == grab_wait(grab_v4l, &gb)) { - gb_pal[format] = 2; - goto done; - } - gb_pal[format] = 1; - fprintf(stderr, "ok\n"); - - done: - return gb_pal[format] == 1; -} - -static int - grab_mm_setparams(struct GRABBER *grab_v4l, int format, int *width, int *height, int *linelength) -{ - //if (!grab_v4l->opened) return -1; - - /* finish old stuff */ - if (grab_v4l->gb_grab > grab_v4l->gb_sync) - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd); - - /* verify parameters */ - ioctl(grab_v4l->fd,VIDIOCGCAP,&grab_v4l->capability); - if (*width > grab_v4l->capability.maxwidth) - *width = grab_v4l->capability.maxwidth; - if (*height > grab_v4l->capability.maxheight) - *height = grab_v4l->capability.maxheight; - *linelength = *width * format2depth[format] / 8; - -#if 1 - /* XXX bttv bug workaround - it returns a larger size than it can handle */ - if (*width > 768+76) { - *width = 768+76; - *linelength = *width * format2depth[format] / 8; - } -#endif - - /* initialize everything */ - grab_v4l->gb_even.format = grab_v4l->gb_odd.format = - (format < sizeof(format2palette)/sizeof(unsigned short)) ? - format2palette[format] : 0; - if (grab_v4l->gb_even.format == 0 || !grab_probe(grab_v4l, grab_v4l->gb_even.format)) { - return -1; - } - grab_v4l->pixmap_bytes = format2depth[format] / 8; - grab_v4l->gb_even.frame = 0; - grab_v4l->gb_odd.frame = 1; - grab_v4l->gb_even.width = *width; - grab_v4l->gb_even.height = *height; - grab_v4l->gb_odd.width = *width; - grab_v4l->gb_odd.height = *height; - grab_v4l->even = 0; - - return 0; -} - -static void* - grab_mm_capture(struct GRABBER *grab_v4l, int single) -{ - void *buf; - - if (!single && grab_v4l->gb_grab == grab_v4l->gb_sync) - /* streaming capture started */ - if (-1 == grab_queue(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd,0)) - return NULL; - - if (single && grab_v4l->gb_grab > grab_v4l->gb_sync) - /* clear streaming capture */ - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd); - - /* queue */ - if (-1 == grab_queue(grab_v4l, grab_v4l->even ? &grab_v4l->gb_odd : &grab_v4l->gb_even,0)) - return NULL; - if (grab_v4l->gb_grab > grab_v4l->gb_sync+1) { - /* wait -- streaming */ - //fprintf(stderr, "v4lsrc: 1 %d %d\n", grab_v4l->gb_grab, gb_sync); - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd); - buf = grab_v4l->map + grab_v4l->gb_buffers.offsets[grab_v4l->even ? 0 : 1]; - } else { - /* wait -- single */ - //fprintf(stderr, "v4lsrc: 2 %d %d %d\n", grab_v4l->gb_grab, gb_sync, even); - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_odd : &grab_v4l->gb_even); - buf = grab_v4l->map + grab_v4l->gb_buffers.offsets[grab_v4l->even ? 1 : 0]; - } - grab_v4l->even = !grab_v4l->even; - //fprintf(stderr, "v4lsrc: even %d\n", even); - - return buf; -} - -static void - grab_mm_cleanup(struct GRABBER *grab_v4l) -{ - if (grab_v4l->gb_grab > grab_v4l->gb_sync) - grab_wait(grab_v4l, grab_v4l->even ? &grab_v4l->gb_even : &grab_v4l->gb_odd); -} - -/* ---------------------------------------------------------------------- */ -/* capture using simple read() */ - -static int - grab_read_setparams(struct GRABBER *grab_v4l, int format, int *width, int *height, int *linelength) -{ - struct video_window win; - - grab_v4l->pict.depth = format2depth[format]; - grab_v4l->pict.palette = format2palette[format]; - - /* set format */ - if (-1 == ioctl(grab_v4l->fd,VIDIOCSPICT,&grab_v4l->pict)) { - perror("v4l: ioctl VIDIOCSPICT"); - return -1; - } - if (-1 == ioctl(grab_v4l->fd,VIDIOCGPICT,&grab_v4l->pict)) { - perror("v4l: ioctl VIDIOCGPICT"); - return -1; - } - - /* set size */ - ioctl(grab_v4l->fd,VIDIOCGCAP,&grab_v4l->capability); - if (*width > grab_v4l->capability.maxwidth) - *width = grab_v4l->capability.maxwidth; - if (*height > grab_v4l->capability.maxheight) - *height = grab_v4l->capability.maxheight; - memset(&win,0,sizeof(struct video_window)); - win.width = *width; - win.height = *height; - if (-1 == ioctl(grab_v4l->fd,VIDIOCSWIN,&win)) { - perror("v4l: ioctl VIDIOCSWIN"); - return -1; - } - if (-1 == ioctl(grab_v4l->fd,VIDIOCGWIN,&win)) { - perror("v4l: ioctl VIDIOCGWIN"); - return -1; - } - - *width = win.width; - *height = win.height; - *linelength = *width * format2depth[format] / 8; - - /* alloc buffer */ - grab_v4l->grab_read_size = *linelength * *height; - if (grab_v4l->grab_read_buf) - free(grab_v4l->grab_read_buf); - grab_v4l->grab_read_buf = malloc(grab_v4l->grab_read_size); - if (NULL == grab_v4l->grab_read_buf) - return -1; - - - return 0; -} - -static void* -grab_read_capture(struct GRABBER *grab_v4l, int single) -{ - int rc; - - rc = read(grab_v4l->fd,grab_v4l->grab_read_buf,grab_v4l->grab_read_size); - if (grab_v4l->grab_read_size != rc) { - fprintf(stderr,"v4l: grabber read error (rc=%d)\n",rc); - return NULL; - } - return grab_v4l->grab_read_buf; -} - -static void -grab_read_cleanup(struct GRABBER *grab_v4l) -{ - if (grab_v4l->grab_read_buf) { - free(grab_v4l->grab_read_buf); - grab_v4l->grab_read_buf = NULL; - } -} - -/* ---------------------------------------------------------------------- */ - -static int - grab_tune(struct GRABBER *grab_v4l, unsigned long freq) -{ - freq = freq*16/1000; - fprintf(stderr,"v4l: freq: %.3f\n",(float)freq/16); - if (-1 == ioctl(grab_v4l->fd, VIDIOCSFREQ, &freq)) - perror("v4l: ioctl VIDIOCSFREQ"); - return 0; -} - -static int - grab_tuned(struct GRABBER *grab_v4l) -{ - usleep(10000); - if (-1 == ioctl(grab_v4l->fd,VIDIOCGTUNER,grab_v4l->tuner)) { - perror("v4l: ioctl VIDIOCGTUNER"); - return 0; - } - return grab_v4l->tuner->signal ? 1 : 0; -} - -static int - grab_input(struct GRABBER *grab_v4l, int input, int norm) -{ - if (-1 != input) { - fprintf(stderr,"v4l: input: %d\n",input); - grab_v4l->cur_input = input; - } - if (-1 != norm) { - fprintf(stderr,"v4l: norm : %d\n",norm); - grab_v4l->cur_norm = norm; - } - - grab_v4l->channels[grab_v4l->cur_input].norm = grab_v4l->cur_norm; - if (-1 == ioctl(grab_v4l->fd, VIDIOCSCHAN, &grab_v4l->channels[grab_v4l->cur_input])) - perror("v4l: ioctl VIDIOCSCHAN"); - return 0; -} - -/* ---------------------------------------------------------------------- */ - -int grab_hasattr(struct GRABBER *grab_v4l, int id) -{ - int i; - - for (i = 0; i < NUM_ATTR; i++) - if (id == grab_v4l->grab_attr[i].id && grab_v4l->grab_attr[i].have) - break; - if (i == NUM_ATTR) - return 0; - return 1; -} - -int grab_getattr(struct GRABBER *grab_v4l, int id) -{ - int i; - - for (i = 0; i < NUM_ATTR; i++) - if (id == grab_v4l->grab_attr[i].id && grab_v4l->grab_attr[i].have) - break; - if (i == NUM_ATTR) - return -1; - if (-1 == ioctl(grab_v4l->fd,grab_v4l->grab_attr[i].get,grab_v4l->grab_attr[i].arg)) - perror("v4l: ioctl get"); - - switch (id) { - case GRAB_ATTR_VOLUME: return grab_v4l->audio.volume; - case GRAB_ATTR_MUTE: return grab_v4l->audio.flags & VIDEO_AUDIO_MUTE; - case GRAB_ATTR_MODE: return grab_v4l->audio.mode; - case GRAB_ATTR_COLOR: return grab_v4l->pict.contrast; - case GRAB_ATTR_BRIGHT: return grab_v4l->pict.contrast; - case GRAB_ATTR_HUE: return grab_v4l->pict.contrast; - case GRAB_ATTR_CONTRAST: return grab_v4l->pict.contrast; - default: return -1; - } -} - -int grab_setattr(struct GRABBER *grab_v4l, int id, int val) -{ - int i; - - /* read ... */ - for (i = 0; i < NUM_ATTR; i++) - if (id == grab_v4l->grab_attr[i].id && grab_v4l->grab_attr[i].have) - break; - if (i == NUM_ATTR) - return -1; - if (-1 == ioctl(grab_v4l->fd,grab_v4l->grab_attr[i].set,grab_v4l->grab_attr[i].arg)) - perror("v4l: ioctl get"); - - /* ... modify ... */ - switch (id) { - case GRAB_ATTR_VOLUME: grab_v4l->audio.volume = val; break; - case GRAB_ATTR_MUTE: - if (val) - grab_v4l->audio.flags |= VIDEO_AUDIO_MUTE; - else - grab_v4l->audio.flags &= ~VIDEO_AUDIO_MUTE; - break; - case GRAB_ATTR_MODE: grab_v4l->audio.mode = val; break; - case GRAB_ATTR_COLOR: grab_v4l->pict.colour = val; break; - case GRAB_ATTR_BRIGHT: grab_v4l->pict.brightness = val; break; - case GRAB_ATTR_HUE: grab_v4l->pict.hue = val; break; - case GRAB_ATTR_CONTRAST: grab_v4l->pict.contrast = val; break; - default: return -1; - } - - /* ... write */ - if (-1 == ioctl(grab_v4l->fd,grab_v4l->grab_attr[i].set,grab_v4l->grab_attr[i].arg)) - perror("v4l: ioctl set"); - return 0; -} - diff --git a/sys/v4l/grab.h b/sys/v4l/grab.h deleted file mode 100644 index 0eafe76a1f..0000000000 --- a/sys/v4l/grab.h +++ /dev/null @@ -1,121 +0,0 @@ -#define VIDEO_RGB08 1 /* bt848 dithered */ -#define VIDEO_GRAY 2 -#define VIDEO_RGB15_LE 3 /* 15 bpp little endian */ -#define VIDEO_RGB16_LE 4 /* 16 bpp little endian */ -#define VIDEO_RGB15_BE 5 /* 15 bpp big endian */ -#define VIDEO_RGB16_BE 6 /* 16 bpp big endian */ -#define VIDEO_BGR24 7 /* bgrbgrbgrbgr (LE) */ -#define VIDEO_BGR32 8 /* bgr-bgr-bgr- (LE) */ -#define VIDEO_RGB24 9 /* rgbrgbrgbrgb (BE)*/ -#define VIDEO_RGB32 10 /* -rgb-rgb-rgb (BE)*/ -#define VIDEO_LUT2 11 /* lookup-table 2 byte depth */ -#define VIDEO_LUT4 12 /* lookup-table 4 byte depth */ -#define VIDEO_YUV422 13 /* YUV 4:2:2 */ -#define VIDEO_YUV422P 14 /* YUV 4:2:2 (planar) */ -#define VIDEO_YUV420P 15 /* YUV 4:2:0 (planar) */ -#define VIDEO_MJPEG 16 /* MJPEG */ - -#define CAN_AUDIO_VOLUME 1 - -#define GRAB_ATTR_VOLUME 1 -#define GRAB_ATTR_MUTE 2 -#define GRAB_ATTR_MODE 3 - -#define GRAB_ATTR_COLOR 11 -#define GRAB_ATTR_BRIGHT 12 -#define GRAB_ATTR_HUE 13 -#define GRAB_ATTR_CONTRAST 14 - -#define TRAP(txt) fprintf(stderr,"%s:%d:%s\n",__FILE__,__LINE__,txt);exit(1); - -/* ------------------------------------------------------------------------- */ - -struct STRTAB { - long nr; - char *str; -}; - -typedef struct _OverlayClip OverlayClip; - -struct _OverlayClip { - int x1, x2, y1, y2; -}; - -struct GRAB_ATTR { - int id; - int have; - int get; - int set; - void *arg; -}; - -struct GRABBER { - char *name; - int flags; - const struct STRTAB *norms; - struct STRTAB *inputs; - const struct STRTAB *audio_modes; - int opened; - char *map; - int fd, fd_grab; - - /* generic informations */ - struct video_capability capability; - struct video_channel *channels; - struct video_audio audio; - struct video_tuner *tuner; - struct video_picture pict; -#define NUM_ATTR 7 - struct GRAB_ATTR grab_attr[NUM_ATTR]; - - int cur_input; - int cur_norm; - int grab_read_size; - char *grab_read_buf; - - /* overlay */ - struct video_window ov_win; - struct video_clip ov_clips[32]; - struct video_buffer ov_fbuf; - - /* screen grab */ - struct video_mmap gb_even; - struct video_mmap gb_odd; - int even,pixmap_bytes; - int gb_grab,gb_sync; - struct video_mbuf gb_buffers; - - - /* state */ - int overlay, swidth, sheight; - - int (*grab_open)(struct GRABBER *grab_v4l, char *opt); - int (*grab_close)(struct GRABBER *grab_v4l); - - int (*grab_setupfb)(struct GRABBER *grab_v4l, int sw, int sh, int format, void *base, int bpl); - int (*grab_overlay)(struct GRABBER *grab_v4l, int x, int y, int width, int height, int format, - OverlayClip *oc, int count); - int (*grab_offscreen)(struct GRABBER *grab_v4l, int start, int pitch, int width, int height, - int format); - - int (*grab_setparams)(struct GRABBER *grab_v4l, int format, int *width, int *height, int *linelength); - void* (*grab_capture)(struct GRABBER *grab_v4l, int single); - void (*grab_cleanup)(struct GRABBER *grab_v4l); - - int (*grab_tune)(struct GRABBER *grab_v4l, unsigned long freq); - int (*grab_tuned)(struct GRABBER *grab_v4l); - int (*grab_input)(struct GRABBER *grab_v4l, int input, int norm); - -#if 0 - int (*grab_picture)(int color, int bright, int hue, int contrast); - int (*grab_audio)(int mute, int volume, int *mode); -#else - int (*grab_hasattr)(struct GRABBER *grab_v4l, int id); - int (*grab_getattr)(struct GRABBER *grab_v4l, int id); - int (*grab_setattr)(struct GRABBER *grab_v4l, int id, int val); -#endif -}; - -/* ------------------------------------------------------------------------- */ - -struct GRABBER *grab_init();