This is an automatic generated email to let you know that the following patch were queued at the http://git.linuxtv.org/xawtv3.git tree:
Subject: Remove the legacy V4L1 driver from xawtv Author: Mauro Carvalho Chehab <[email protected]> Date: Thu Jan 27 19:51:55 2011 -0200 Signed-off-by: Mauro Carvalho Chehab <[email protected]> libng/plugins/Subdir.mk | 6 - libng/plugins/drv1-v4l.c | 1175 ---------------------------------------------- 2 files changed, 0 insertions(+), 1181 deletions(-) --- http://git.linuxtv.org/xawtv3.git?a=commitdiff;h=95c417f2e48eac8947e308ec9006b9b42f0fd436 diff --git a/libng/plugins/Subdir.mk b/libng/plugins/Subdir.mk index 37c3b54..d799e10 100644 --- a/libng/plugins/Subdir.mk +++ b/libng/plugins/Subdir.mk @@ -22,7 +22,6 @@ ifeq ($(FOUND_OS),linux) TARGETS-plugins += \ libng/plugins/drv0-v4l2.so \ libng/plugins/drv0-v4l2-old.so \ - libng/plugins/drv1-v4l.so \ libng/plugins/snd-oss.so endif ifeq ($(FOUND_OS),bsd) @@ -73,11 +72,6 @@ libng/plugins/drv0-v4l2.so: \ libng/plugins/struct-v4l2.o \ libng/plugins/struct-dump.o -libng/plugins/drv1-v4l.so: \ - libng/plugins/drv1-v4l.o \ - libng/plugins/struct-v4l.o \ - libng/plugins/struct-dump.o - libng/plugins/struct-dump.o: structs/struct-dump.c @$(echo_compile_c) @$(compile_c) diff --git a/libng/plugins/drv1-v4l.c b/libng/plugins/drv1-v4l.c deleted file mode 100644 index 2998113..0000000 --- a/libng/plugins/drv1-v4l.c +++ /dev/null @@ -1,1175 +0,0 @@ -/* - * interface to the v4l driver - * - * (c) 1997-2001 Gerd Knorr <[email protected]> - * - */ -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <math.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <signal.h> -#include <pthread.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include <sys/stat.h> -#include <sys/mman.h> - -#include "videodev.h" - -#include "grab-ng.h" - -#include "struct-dump.h" -#include "struct-v4l.h" - -#define SYNC_TIMEOUT 5 - -/* ---------------------------------------------------------------------- */ - -/* open+close */ -static void* v4l_open(char *device); -static int v4l_close(void *handle); - -/* attributes */ -static char* v4l_devname(void *handle); -static int v4l_flags(void *handle); -static struct ng_attribute* v4l_attrs(void *handle); -static int v4l_read_attr(struct ng_attribute*); -static void v4l_write_attr(struct ng_attribute*, int val); - -/* overlay */ -static int v4l_setupfb(void *handle, struct ng_video_fmt *fmt, void *base); -static int v4l_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, - struct OVERLAY_CLIP *oc, int count, int aspect); - -/* capture video */ -static int v4l_setformat(void *handle, struct ng_video_fmt *fmt); -static int v4l_startvideo(void *handle, int fps, unsigned int buffers); -static void v4l_stopvideo(void *handle); -static struct ng_video_buf* v4l_nextframe(void *handle); -static struct ng_video_buf* v4l_getimage(void *handle); - -/* tuner */ -static unsigned long v4l_getfreq(void *handle); -static void v4l_setfreq(void *handle, unsigned long freq); -static int v4l_tuned(void *handle); - -/* ---------------------------------------------------------------------- */ - -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 struct STRTAB stereo[] = { - { 0, "auto" }, - { VIDEO_SOUND_MONO, "mono" }, - { VIDEO_SOUND_STEREO, "stereo" }, - { VIDEO_SOUND_LANG1, "lang1" }, - { VIDEO_SOUND_LANG2, "lang2" }, - { -1, NULL }, -}; -static struct STRTAB norms_v4l[] = { - { VIDEO_MODE_PAL, "PAL" }, - { VIDEO_MODE_NTSC, "NTSC" }, - { VIDEO_MODE_SECAM, "SECAM" }, - { VIDEO_MODE_AUTO, "AUTO" }, - { -1, NULL } -}; -static struct STRTAB norms_bttv[] = { - { VIDEO_MODE_PAL, "PAL" }, - { VIDEO_MODE_NTSC, "NTSC" }, - { VIDEO_MODE_SECAM, "SECAM" }, - { 3, "PAL-NC" }, - { 4, "PAL-M" }, - { 5, "PAL-N" }, - { 6, "NTSC-JP" }, - { -1, NULL } -}; - -static unsigned short format2palette[VIDEO_FMT_COUNT] = { - [ VIDEO_RGB08 ] = VIDEO_PALETTE_HI240, - [ VIDEO_GRAY ] = VIDEO_PALETTE_GREY, - [ VIDEO_RGB15_LE ] = VIDEO_PALETTE_RGB555, - [ VIDEO_RGB16_LE ] = VIDEO_PALETTE_RGB565, - [ VIDEO_BGR24 ] = VIDEO_PALETTE_RGB24, - [ VIDEO_BGR32 ] = VIDEO_PALETTE_RGB32, - [ VIDEO_YUYV ] = VIDEO_PALETTE_YUV422, - [ VIDEO_UYVY ] = VIDEO_PALETTE_UYVY, - [ VIDEO_YUV422P ] = VIDEO_PALETTE_YUV422P, - [ VIDEO_YUV420P ] = VIDEO_PALETTE_YUV420P, -}; - -/* pass 0/1 by reference */ -static int one = 1, zero = 0; - -/* ---------------------------------------------------------------------- */ - -struct v4l_handle { - int fd; - - /* general informations */ - struct video_capability capability; - struct video_channel *channels; - struct video_tuner tuner; - struct video_audio audio; - struct video_picture pict; - - /* attributes */ - int nattr; - struct ng_attribute *attr; - int input; - int audio_mode; - - /* overlay */ - struct video_buffer fbuf; - struct video_window win; - int ov_error; - unsigned int ov_fmtid; - int ov_enabled; - int ov_on; - - /* capture */ - int use_read; - struct ng_video_fmt fmt; - long long start; - int fps; - - /* capture via read() */ - struct ng_video_fmt rd_fmt; - struct video_window rd_win; - unsigned int rd_fmtid; - - /* capture to mmap()'ed buffers */ - struct video_mbuf mbuf; - unsigned char *mmap; - unsigned int nbuf; - unsigned int queue; - unsigned int waiton; - int probe[VIDEO_FMT_COUNT]; - struct video_mmap *buf_v4l; - struct ng_video_buf *buf_me; -}; - -struct ng_vid_driver v4l_driver = { - name: "v4l", - open: v4l_open, - close: v4l_close, - - get_devname: v4l_devname, - capabilities: v4l_flags, - list_attrs: v4l_attrs, - - setupfb: v4l_setupfb, - overlay: v4l_overlay, - - setformat: v4l_setformat, - startvideo: v4l_startvideo, - stopvideo: v4l_stopvideo, - nextframe: v4l_nextframe, - getimage: v4l_getimage, - - getfreq: v4l_getfreq, - setfreq: v4l_setfreq, - is_tuned: v4l_tuned, -}; - -/* ---------------------------------------------------------------------- */ - -static int alarms; - -static void -sigalarm(int signal) -{ - alarms++; - fprintf(stderr,"v4l: timeout (got SIGALRM), hardware/driver problems?\n"); -} - -static void -siginit(void) -{ - struct sigaction act,old; - - memset(&act,0,sizeof(act)); - act.sa_handler = sigalarm; - sigemptyset(&act.sa_mask); - sigaction(SIGALRM,&act,&old); -} - -/* ---------------------------------------------------------------------- */ - -#define PREFIX "ioctl: " - -static int -xioctl(int fd, int cmd, void *arg) -{ - int rc; - - rc = ioctl(fd,cmd,arg); - if (0 == rc && ng_debug < 2) - return 0; - print_ioctl(stderr,ioctls_v4l1,PREFIX,cmd,arg); - fprintf(stderr,": %s\n",(rc == 0) ? "ok" : strerror(errno)); - return rc; -} - -/* ---------------------------------------------------------------------- */ - -static void -v4l_add_attr(struct v4l_handle *h, int id, int type, - int defval, struct STRTAB *choices) -{ - h->attr = realloc(h->attr,(h->nattr+2) * sizeof(struct ng_attribute)); - memset(h->attr+h->nattr,0,sizeof(struct ng_attribute)*2); - h->attr[h->nattr].id = id; - h->attr[h->nattr].type = type; - h->attr[h->nattr].defval = defval; - h->attr[h->nattr].choices = choices; - if (ATTR_TYPE_INTEGER == type) { - h->attr[h->nattr].min = 0; - h->attr[h->nattr].max = 65535; - } - if (id < ATTR_ID_COUNT) - h->attr[h->nattr].name = ng_attr_to_desc[id]; - - h->attr[h->nattr].read = v4l_read_attr; - h->attr[h->nattr].write = v4l_write_attr; - h->attr[h->nattr].handle = h; - h->nattr++; -} - -static void* -v4l_open(char *device) -{ - struct v4l_handle *h; - struct STRTAB *inputs; - struct STRTAB *norms; - unsigned int i; - int rc; - - h = malloc(sizeof(*h)); - if (NULL == h) - return NULL; - memset(h,0,sizeof(*h)); - - /* open device */ - if (-1 == (h->fd = open(device,O_RDWR))) { - fprintf(stderr,"v4l: open %s: %s\n",device,strerror(errno)); - goto err; - } - if (-1 == ioctl(h->fd,VIDIOCGCAP,&h->capability)) - goto err; - - if (ng_debug) - fprintf(stderr, "v4l: open: %s (%s)\n",device,h->capability.name); - fcntl(h->fd,F_SETFD,FD_CLOEXEC); - siginit(); - if (ng_debug) { - fprintf(stderr," capabilities: "); - for (i = 0; device_cap[i] != NULL; i++) - if (h->capability.type & (1 << i)) - fprintf(stderr," %s",device_cap[i]); - fprintf(stderr,"\n"); - fprintf(stderr," size : %dx%d => %dx%d\n", - h->capability.minwidth,h->capability.minheight, - h->capability.maxwidth,h->capability.maxheight); - } - - /* input sources */ - if (ng_debug) - fprintf(stderr," channels: %d\n",h->capability.channels); - h->channels = malloc(sizeof(struct video_channel)*h->capability.channels); - memset(h->channels,0,sizeof(struct video_channel)*h->capability.channels); - inputs = malloc(sizeof(struct STRTAB)*(h->capability.channels+1)); - memset(inputs,0,sizeof(struct STRTAB)*(h->capability.channels+1)); - for (i = 0; i < h->capability.channels; i++) { - h->channels[i].channel = i; - xioctl(h->fd,VIDIOCGCHAN,&(h->channels[i])); - inputs[i].nr = i; - inputs[i].str = h->channels[i].name; - if (ng_debug) - fprintf(stderr," %s: %d %s%s %s%s\n", - h->channels[i].name, - h->channels[i].tuners, - (h->channels[i].flags & VIDEO_VC_TUNER) ? "tuner " : "", - (h->channels[i].flags & VIDEO_VC_AUDIO) ? "audio " : "", - (h->channels[i].type & VIDEO_TYPE_TV) ? "tv " : "", - (h->channels[i].type & VIDEO_TYPE_CAMERA) ? "camera " : ""); - } - inputs[i].nr = -1; - inputs[i].str = NULL; - v4l_add_attr(h,ATTR_ID_INPUT,ATTR_TYPE_CHOICE,0,inputs); - - /* audios */ - if (ng_debug) - fprintf(stderr," audios : %d\n",h->capability.audios); - if (h->capability.audios) { - h->audio.audio = 0; - xioctl(h->fd,VIDIOCGAUDIO,&h->audio); - if (ng_debug) { - fprintf(stderr," %d (%s): ",i,h->audio.name); - if (h->audio.flags & VIDEO_AUDIO_MUTABLE) - fprintf(stderr,"muted=%s ", - (h->audio.flags&VIDEO_AUDIO_MUTE) ? "yes":"no"); - if (h->audio.flags & VIDEO_AUDIO_VOLUME) - fprintf(stderr,"volume=%d ",h->audio.volume); - if (h->audio.flags & VIDEO_AUDIO_BASS) - fprintf(stderr,"bass=%d ",h->audio.bass); - if (h->audio.flags & VIDEO_AUDIO_TREBLE) - fprintf(stderr,"treble=%d ",h->audio.treble); - fprintf(stderr,"\n"); - } - v4l_add_attr(h,ATTR_ID_MUTE,ATTR_TYPE_BOOL,0,NULL); - v4l_add_attr(h,ATTR_ID_AUDIO_MODE,ATTR_TYPE_CHOICE,0,stereo); - if (h->audio.flags & VIDEO_AUDIO_VOLUME) - v4l_add_attr(h,ATTR_ID_VOLUME,ATTR_TYPE_INTEGER,0,NULL); - } - - /* tv norms / tuner */ - norms = malloc(sizeof(norms_v4l)); - memcpy(norms,norms_v4l,sizeof(norms_v4l)); - if (h->capability.type & VID_TYPE_TUNER) { - /* have tuner */ - xioctl(h->fd,VIDIOCGTUNER,&h->tuner); - if (ng_debug) - fprintf(stderr," tuner : %s %lu-%lu", - h->tuner.name,h->tuner.rangelow,h->tuner.rangehigh); - for (i = 0; norms[i].str != NULL; i++) { - if (h->tuner.flags & (1<<i)) { - if (ng_debug) - fprintf(stderr," %s",norms[i].str); - } else - norms[i].nr = -1; - } - if (ng_debug) - fprintf(stderr,"\n"); - } else { - /* no tuner */ - struct video_channel vchan; - memcpy(&vchan, &h->channels[0], sizeof(struct video_channel)); - for (i = 0; norms[i].str != NULL; i++) { - vchan.norm = i; - if (-1 == xioctl(h->fd,VIDIOCSCHAN,&vchan)) - norms[i].nr = -1; - else if (ng_debug) - fprintf(stderr," %s",norms[i].str); - } - /* restore settings after probe */ - memcpy(&vchan, &h->channels[0], sizeof(struct video_channel)); - xioctl(h->fd,VIDIOCSCHAN,&vchan); - if (ng_debug) - fprintf(stderr,"\n"); - } - -#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 != (rc = ioctl(h->fd,BTTV_VERSION,&i))) { - norms = norms_bttv; - if (ng_debug || rc < 0x000700) - fprintf(stderr,"v4l: bttv version %d.%d.%d\n", - (rc >> 16) & 0xff, - (rc >> 8) & 0xff, - rc & 0xff); - if (rc < 0x000700) - fprintf(stderr, - "v4l: prehistoric bttv version found, please try to\n" - " upgrade the driver before mailing bug reports\n"); - } -#endif - v4l_add_attr(h,ATTR_ID_NORM,ATTR_TYPE_CHOICE,0,norms); - - /* frame buffer */ - xioctl(h->fd,VIDIOCGFBUF,&h->fbuf); - if (ng_debug) - fprintf(stderr," fbuffer : base=0x%p size=%dx%d depth=%d bpl=%d\n", - h->fbuf.base, h->fbuf.width, h->fbuf.height, - h->fbuf.depth, h->fbuf.bytesperline); - - /* picture parameters */ - xioctl(h->fd,VIDIOCGPICT,&h->pict); - v4l_add_attr(h,ATTR_ID_BRIGHT, ATTR_TYPE_INTEGER,0,NULL); - v4l_add_attr(h,ATTR_ID_HUE, ATTR_TYPE_INTEGER,0,NULL); - v4l_add_attr(h,ATTR_ID_COLOR, ATTR_TYPE_INTEGER,0,NULL); - v4l_add_attr(h,ATTR_ID_CONTRAST,ATTR_TYPE_INTEGER,0,NULL); - if (ng_debug) { - fprintf(stderr, - " picture : brightness=%d hue=%d colour=%d contrast=%d\n", - h->pict.brightness, h->pict.hue, - h->pict.colour, h->pict.contrast); - fprintf(stderr, - " picture : whiteness=%d depth=%d palette=%s\n", - h->pict.whiteness, h->pict.depth, PALETTE(h->pict.palette)); - } - - if (h->capability.type & VID_TYPE_CAPTURE) { - /* map grab buffer */ - if (0 == xioctl(h->fd,VIDIOCGMBUF,&h->mbuf)) { - if (ng_debug) - fprintf(stderr," mbuf: size=%d frames=%d\n", - h->mbuf.size,h->mbuf.frames); - h->mmap = mmap(0,h->mbuf.size,PROT_READ|PROT_WRITE, - MAP_SHARED,h->fd,0); - if ((unsigned char*)-1 == h->mmap) - perror("mmap"); - } else { - h->mmap = (unsigned char*)-1; - } - if ((unsigned char*)-1 != h->mmap) { - if (ng_debug) - fprintf(stderr," v4l: using mapped buffers for capture\n"); - h->use_read = 0; - h->nbuf = h->mbuf.frames; - h->buf_v4l = malloc(h->nbuf * sizeof(struct video_mmap)); - memset(h->buf_v4l,0,h->nbuf * sizeof(struct video_mmap)); - h->buf_me = malloc(h->nbuf * sizeof(struct ng_video_buf)); - for (i = 0; i < h->nbuf; i++) { - ng_init_video_buf(h->buf_me+i); - h->buf_me[i].release = ng_wakeup_video_buf; - } - } else { - if (ng_debug) - fprintf(stderr," v4l: using read() for capture\n"); - h->use_read = 1; - } - } - - return h; - -err: - if (h->fd != -1) - close(h->fd); - free(h); - return NULL; -} - -static int -v4l_close(void *handle) -{ - struct v4l_handle *h = handle; - - if (ng_debug) - fprintf(stderr, "v4l: close\n"); - - if ((unsigned char*)-1 != h->mmap) - munmap(h->mmap,h->mbuf.size); - - close(h->fd); - free(h); - return 0; -} - -/* ---------------------------------------------------------------------- */ - -static char* -v4l_devname(void *handle) -{ - struct v4l_handle *h = handle; - return h->capability.name; -} - -static int v4l_flags(void *handle) -{ - struct v4l_handle *h = handle; - int ret = 0; - - if (h->capability.type & VID_TYPE_OVERLAY) - ret |= CAN_OVERLAY; - if (h->capability.type & VID_TYPE_CAPTURE && - !h->ov_error) - ret |= CAN_CAPTURE; - if (h->capability.type & VID_TYPE_TUNER) - ret |= CAN_TUNE; - if (h->capability.type & VID_TYPE_CHROMAKEY) - ret |= NEEDS_CHROMAKEY; - return ret; -} - -static struct ng_attribute* v4l_attrs(void *handle) -{ - struct v4l_handle *h = handle; - return h->attr; -} - -static int audio_mode_mask2bit(int mode) -{ - if (mode & VIDEO_SOUND_STEREO) - return VIDEO_SOUND_STEREO; - if (mode & VIDEO_SOUND_LANG1) - return VIDEO_SOUND_LANG1; - if (mode & VIDEO_SOUND_LANG2) - return VIDEO_SOUND_LANG2; - if (mode & VIDEO_SOUND_MONO) - return VIDEO_SOUND_MONO; - return 0; -} - -static int v4l_read_attr(struct ng_attribute *attr) -{ - struct v4l_handle *h = attr->handle; - - switch (attr->id) { - case ATTR_ID_INPUT: - return -1; - case ATTR_ID_NORM: - xioctl(h->fd, VIDIOCGCHAN, &h->channels[h->input]); - return h->channels[h->input].norm; - case ATTR_ID_MUTE: - xioctl(h->fd, VIDIOCGAUDIO, &h->audio); - return h->audio.flags & VIDEO_AUDIO_MUTE; - case ATTR_ID_VOLUME: - xioctl(h->fd, VIDIOCGAUDIO, &h->audio); - return h->audio.volume; - case ATTR_ID_AUDIO_MODE: - xioctl(h->fd, VIDIOCGAUDIO, &h->audio); - return audio_mode_mask2bit(h->audio.mode); - case ATTR_ID_COLOR: - xioctl(h->fd, VIDIOCGPICT, &h->pict); - return h->pict.colour; - case ATTR_ID_BRIGHT: - xioctl(h->fd, VIDIOCGPICT, &h->pict); - return h->pict.brightness; - case ATTR_ID_HUE: - xioctl(h->fd, VIDIOCGPICT, &h->pict); - return h->pict.hue; - case ATTR_ID_CONTRAST: - xioctl(h->fd, VIDIOCGPICT, &h->pict); - return h->pict.contrast; - } - return -1; -} - -static void v4l_write_attr(struct ng_attribute *attr, int val) -{ - struct v4l_handle *h = attr->handle; - - /* read ... */ - switch (attr->id) { - case ATTR_ID_INPUT: - /* nothing */ - break; - case ATTR_ID_NORM: - xioctl(h->fd, VIDIOCGCHAN, &h->channels[h->input]); - break; - case ATTR_ID_MUTE: - case ATTR_ID_VOLUME: - case ATTR_ID_AUDIO_MODE: - xioctl(h->fd, VIDIOCGAUDIO, &h->audio); - break; - case ATTR_ID_COLOR: - case ATTR_ID_BRIGHT: - case ATTR_ID_HUE: - case ATTR_ID_CONTRAST: - xioctl(h->fd, VIDIOCGPICT, &h->pict); - break; - } - - /* ... modify ... */ - switch (attr->id) { - case ATTR_ID_INPUT: - h->input = val; - h->audio_mode = 0; - break; - case ATTR_ID_NORM: - h->channels[h->input].norm = val; - h->audio_mode = 0; - break; - case ATTR_ID_MUTE: - if (val) - h->audio.flags |= VIDEO_AUDIO_MUTE; - else - h->audio.flags &= ~VIDEO_AUDIO_MUTE; - break; - case ATTR_ID_VOLUME: - h->audio.volume = val; - break; - case ATTR_ID_AUDIO_MODE: - h->audio_mode = val; - break; - case ATTR_ID_COLOR: - h->pict.colour = val; - break; - case ATTR_ID_BRIGHT: - h->pict.brightness = val; - break; - case ATTR_ID_HUE: - h->pict.hue = val; - break; - case ATTR_ID_CONTRAST: - h->pict.contrast = val; - break; - } - /* have to set that all the time as read and write have - slightly different semantics: - read == bitmask with all available modes flagged - write == one bit set (for the selected mode, zero is autodetect) - */ - h->audio.mode = h->audio_mode; - - /* ... write */ - switch (attr->id) { - case ATTR_ID_INPUT: - case ATTR_ID_NORM: - xioctl(h->fd, VIDIOCSCHAN, &h->channels[h->input]); - break; - case ATTR_ID_MUTE: - case ATTR_ID_VOLUME: - case ATTR_ID_AUDIO_MODE: - xioctl(h->fd, VIDIOCSAUDIO, &h->audio); - break; - case ATTR_ID_COLOR: - case ATTR_ID_BRIGHT: - case ATTR_ID_HUE: - case ATTR_ID_CONTRAST: - xioctl(h->fd, VIDIOCSPICT, &h->pict); - break; - } -} - -static unsigned long -v4l_getfreq(void *handle) -{ - struct v4l_handle *h = handle; - unsigned long freq; - - xioctl(h->fd, VIDIOCGFREQ, &freq); - return freq; -} - -static void -v4l_setfreq(void *handle, unsigned long freq) -{ - struct v4l_handle *h = handle; - - if (ng_debug) - fprintf(stderr,"v4l: freq: %.3f\n",(float)freq/16); - xioctl(h->fd, VIDIOCSFREQ, &freq); - h->audio_mode = 0; -} - -static int -v4l_tuned(void *handle) -{ - struct v4l_handle *h = handle; - - /* usleep(10000); */ - if (-1 == xioctl(h->fd,VIDIOCGTUNER,&h->tuner)) - return 0; - return h->tuner.signal ? 1 : 0; -} - - -/* ---------------------------------------------------------------------- */ -/* do overlay */ - -int -v4l_setupfb(void *handle, struct ng_video_fmt *fmt, void *base) -{ - struct v4l_handle *h = handle; - - /* overlay supported ?? */ - if (!(h->capability.type & VID_TYPE_OVERLAY)) { - if (ng_debug) - fprintf(stderr,"v4l: device has no overlay support\n"); - return -1; - } - - /* double-check settings */ - if (ng_debug) - fprintf(stderr,"v4l: %dx%d, %d bit/pixel, %d byte/scanline\n", - h->fbuf.width,h->fbuf.height, - h->fbuf.depth,h->fbuf.bytesperline); - if ((fmt->bytesperline > 0 && - h->fbuf.bytesperline != fmt->bytesperline) || - (h->fbuf.width != fmt->width) || - (h->fbuf.height != fmt->height)) { - fprintf(stderr, - "WARNING: v4l and x11 disagree about the screen size\n" - "WARNING: Is v4l-conf installed correctly?\n"); - h->ov_error = 1; - } - if (ng_vfmt_to_depth[fmt->fmtid] != ((h->fbuf.depth+7)&0xf8)) { - fprintf(stderr, - "WARNING: v4l and x11 disagree about the color depth\n" - "WARNING: fbuf.depth=%d, x11 depth=%d\n" - "WARNING: Is v4l-conf installed correctly?\n", - h->fbuf.depth,ng_vfmt_to_depth[fmt->fmtid]); - h->ov_error = 1; - } - if (NULL != base) { - /* XXX: minor differences are legal... (matrox problems) */ - if ((void*)((unsigned long)h->fbuf.base & 0xfffff000) != - (void*)((unsigned long)base & 0xfffff000)) { - fprintf(stderr, - "WARNING: v4l and dga disagree about the framebuffer base\n" - "WARNING: fbuf.base=%p, dga=%p\n" - "WARNING: Is v4l-conf installed correctly?\n", - h->fbuf.base,base); - h->ov_error = 1; - } - } - if (h->ov_error) { - fprintf(stderr,"WARNING: overlay mode disabled\n"); - return -1; - } - return 0; -} - -static void -v4l_overlay_set(struct v4l_handle *h, int state) -{ - int rc; - - if (0 == state) { - /* off */ - if (0 == h->ov_on) - return; - xioctl(h->fd, VIDIOCCAPTURE, &zero); - h->ov_on = 0; - } else { - /* on */ - h->pict.depth = ng_vfmt_to_depth[h->ov_fmtid]; - h->pict.palette = GETELEM(format2palette,h->ov_fmtid,0); - xioctl(h->fd, VIDIOCSPICT, &h->pict); - rc = xioctl(h->fd, VIDIOCSWIN, &h->win); - if (0 == rc) { - if (0 != h->ov_on) - return; - xioctl(h->fd, VIDIOCCAPTURE, &one); - h->ov_on = 1; - } else { - /* disable overlay on SWIN failure */ - xioctl(h->fd, VIDIOCCAPTURE, &zero); - h->ov_on = 0; - } - } -} - -int -v4l_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, - struct OVERLAY_CLIP *oc, int count, int aspect) -{ - struct v4l_handle *h = handle; - int i; - - if (h->ov_error) - return -1; - - if (NULL == fmt) { - if (ng_debug) - fprintf(stderr,"v4l: overlay off\n"); - h->ov_enabled = 0; - v4l_overlay_set(h,h->ov_enabled); - return 0; - } - - h->win.x = x; - h->win.y = y; - h->win.width = fmt->width; - h->win.height = fmt->height; - h->win.flags = 0; - h->win.chromakey = 0; - - /* check against max. size */ - xioctl(h->fd,VIDIOCGCAP,&h->capability); - if (h->win.width > h->capability.maxwidth) { - h->win.width = h->capability.maxwidth; - h->win.x += (fmt->width - h->win.width)/2; - } - if (h->win.height > h->capability.maxheight) { - h->win.height = h->capability.maxheight; - h->win.y += (fmt->height - h->win.height)/2; - } - if (aspect) - ng_ratio_fixup(&h->win.width,&h->win.height,&h->win.x,&h->win.y); - -#if 0 - /* pass aligned values -- the driver does'nt get it right yet */ - h->win.width &= ~3; - h->win.height &= ~3; - h->win.x &= ~3; - if (h->win.x < x) - h->win.x += 4; - if (h->win.x+h->win.width > x+fmt->width) - h->win.width -= 4; -#endif - - /* fixups */ - ng_check_clipping(h->win.width, h->win.height, - x - h->win.x, y - h->win.y, - oc, &count); - - /* handle clipping */ - if (h->win.clips) { - free(h->win.clips); - h->win.clips = NULL; - } - h->win.clipcount = 0; - if (h->capability.type & VID_TYPE_CLIPPING && count > 0) { - h->win.clipcount = count; - h->win.clips = malloc(count * sizeof(struct video_clip)); - for (i = 0; i < count; i++) { - h->win.clips[i].x = oc[i].x1; - h->win.clips[i].y = oc[i].y1; - h->win.clips[i].width = oc[i].x2-oc[i].x1; - h->win.clips[i].height = oc[i].y2-oc[i].y1; - } - } - if (h->capability.type & VID_TYPE_CHROMAKEY) - h->win.chromakey = ng_chromakey; - h->ov_enabled = 1; - h->ov_fmtid = fmt->fmtid; - v4l_overlay_set(h,h->ov_enabled); - - if (ng_debug) - fprintf(stderr,"v4l: overlay win=%dx%d+%d+%d, %d clips\n", - fmt->width,fmt->height,x,y,count); - return 0; -} - -/* ---------------------------------------------------------------------- */ - -static int -mm_queue(struct v4l_handle *h) -{ - int frame = h->queue % h->nbuf; - int rc; - - if (0 != h->buf_me[frame].refcount) { - if (0 != h->queue - h->waiton) - return -1; - fprintf(stderr,"v4l: waiting for a free buffer\n"); - ng_waiton_video_buf(h->buf_me+frame); - } - - rc = xioctl(h->fd,VIDIOCMCAPTURE,h->buf_v4l+frame); - if (0 == rc) - h->queue++; - return rc; -} - -static void -mm_queue_all(struct v4l_handle *h) -{ - for (;;) { - if (h->queue - h->waiton >= h->nbuf) - return; - if (0 != mm_queue(h)) - return; - } -} - -static int -mm_waiton(struct v4l_handle *h) -{ - int frame = h->waiton % h->nbuf; - int rc; - - if (0 == h->queue - h->waiton) - return -1; - h->waiton++; - - alarms=0; - alarm(SYNC_TIMEOUT); - - retry: - if (-1 == (rc = xioctl(h->fd,VIDIOCSYNC,h->buf_v4l+frame))) { - if (errno == EINTR && !alarms) - goto retry; - } - alarm(0); - if (-1 == rc) - return -1; - return frame; -} - -static void -mm_clear(struct v4l_handle *h) -{ - while (h->queue > h->waiton) - mm_waiton(h); - h->queue = 0; - h->waiton = 0; -} - -static int -mm_probe(struct v4l_handle *h, unsigned int fmtid) -{ - if (0 != h->probe[fmtid]) - goto done; - - if (ng_debug) - fprintf(stderr, "v4l: capture probe %s...\t", - ng_vfmt_to_desc[fmtid]); - - h->buf_v4l[0].frame = 0; - h->buf_v4l[0].width = h->capability.minwidth; - h->buf_v4l[0].height = h->capability.minheight; - h->buf_v4l[0].format = GETELEM(format2palette,fmtid,0); -#if 1 /* bug compatibility: bttv up to 0.7.67 reports wrong minwidth */ - if (h->buf_v4l[0].width == 32) - h->buf_v4l[0].width = 48; -#endif - - if (0 == h->buf_v4l[0].format) - goto fail; - if (-1 == mm_queue(h)) - goto fail; - if (-1 == mm_waiton(h)) - goto fail; - - if (ng_debug) - fprintf(stderr, "ok\n"); - h->probe[fmtid] = 1; - goto done; - - fail: - if (ng_debug) - fprintf(stderr, "failed\n"); - h->probe[fmtid] = 2; - - done: - mm_clear(h); - return h->probe[fmtid] == 1; -} - -static int -mm_setparams(struct v4l_handle *h, struct ng_video_fmt *fmt) -{ - unsigned int i; - - /* buffers available ? */ - if (h->mbuf.frames < 1) - return -1; - - /* verify parameters */ - xioctl(h->fd,VIDIOCGCAP,&h->capability); - if (fmt->width > h->capability.maxwidth) - fmt->width = h->capability.maxwidth; - if (fmt->height > h->capability.maxheight) - fmt->height = h->capability.maxheight; - fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; - - /* check if we can handle the format */ - if (!mm_probe(h,fmt->fmtid)) - return -1; - - /* initialize everything */ - h->nbuf = h->mbuf.frames; - for (i = 0; i < h->nbuf; i++) { - h->buf_v4l[i].format = GETELEM(format2palette,fmt->fmtid,0); - h->buf_v4l[i].frame = i; - h->buf_v4l[i].width = fmt->width; - h->buf_v4l[i].height = fmt->height; - h->buf_me[i].fmt = *fmt; - h->buf_me[i].data = h->mmap + h->mbuf.offsets[i]; - h->buf_me[i].size = fmt->height * fmt->bytesperline; - } - return 0; -} - -/* ---------------------------------------------------------------------- */ - -static int -read_setformat(struct v4l_handle *h, struct ng_video_fmt *fmt) -{ - xioctl(h->fd,VIDIOCGCAP,&h->capability); - if (fmt->width > h->capability.maxwidth) - fmt->width = h->capability.maxwidth; - if (fmt->height > h->capability.maxheight) - fmt->height = h->capability.maxheight; - fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; - - h->rd_win.width = fmt->width; - h->rd_win.height = fmt->height; - h->rd_fmtid = fmt->fmtid; - - h->pict.depth = ng_vfmt_to_depth[h->rd_fmtid]; - h->pict.palette = GETELEM(format2palette,h->rd_fmtid,0); - if (-1 == xioctl(h->fd, VIDIOCSPICT, &h->pict)) - return -1; - if (-1 == xioctl(h->fd, VIDIOCSWIN, &h->rd_win)) - return -1; - - fmt->width = h->rd_win.width; - fmt->height = h->rd_win.height; - fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; - h->rd_fmt = *fmt; - return 0; -} - -static struct ng_video_buf* -read_getframe(struct v4l_handle *h) -{ - struct ng_video_buf* buf; - int size; - - h->pict.depth = ng_vfmt_to_depth[h->rd_fmtid]; - h->pict.palette = GETELEM(format2palette,h->rd_fmtid,0); - xioctl(h->fd, VIDIOCSPICT, &h->pict); - xioctl(h->fd, VIDIOCSWIN, &h->rd_win); - size = h->rd_fmt.bytesperline * h->rd_fmt.height; - buf = ng_malloc_video_buf(&h->rd_fmt, size); - if (NULL == buf) - return NULL; - if (size != read(h->fd,buf->data,size)) { - ng_release_video_buf(buf); - return NULL; - } - return buf; -} - -/* ---------------------------------------------------------------------- */ - -int -v4l_setformat(void *handle, struct ng_video_fmt *fmt) -{ - struct v4l_handle *h = handle; - int rc; - -#if 0 - /* for debugging color space conversion functions: - force xawtv to capture some specific format */ - if (fmt->fmtid != VIDEO_YUV420P) - return -1; -#endif - - if (ng_debug) - fprintf(stderr,"v4l: setformat\n"); - if (h->use_read) { - v4l_overlay_set(h,0); - rc = read_setformat(h,fmt); - v4l_overlay_set(h,h->ov_enabled); - } else { - if (h->queue != h->waiton) - fprintf(stderr,"v4l: Huh? setformat: found queued buffers (%d %d)\n", - h->queue, h->waiton); - mm_clear(h); - rc = mm_setparams(h,fmt); - } - return rc; -} - -int -v4l_startvideo(void *handle, int fps, unsigned int buffers) -{ - struct v4l_handle *h = handle; - - if (ng_debug) - fprintf(stderr,"v4l: startvideo\n"); - if (0 != h->fps) - fprintf(stderr,"v4l: Huh? start: fps != 0\n"); - if (!h->use_read) { - if (h->nbuf > buffers) - h->nbuf = buffers; - mm_queue_all(h); - } - h->start = ng_get_timestamp(); - h->fps = fps; - return 0; -} - -void -v4l_stopvideo(void *handle) -{ - struct v4l_handle *h = handle; - - if (ng_debug) - fprintf(stderr,"v4l: stopvideo\n"); - if (0 == h->fps) - fprintf(stderr,"v4l: Huh? stop: fps == 0\n"); - if (!h->use_read) - mm_clear(h); - h->fps = 0; -} - -struct ng_video_buf* -v4l_nextframe(void *handle) -{ - struct v4l_handle *h = handle; - struct ng_video_buf* buf = NULL; - int frame = 0; - - if (ng_debug > 1) - fprintf(stderr,"v4l: getimage\n"); - - if (0 == h->fps) { - fprintf(stderr,"v4l: nextframe: fps == 0\n"); - return NULL; - } - - if (h->use_read) { - if (buf) - ng_release_video_buf(buf); - v4l_overlay_set(h,0); - buf = read_getframe(h); - v4l_overlay_set(h,h->ov_enabled); - if (NULL == buf) - return NULL; - memset(&buf->info,0,sizeof(buf->info)); - buf->info.ts = ng_get_timestamp() - h->start; - return buf; - } else { - mm_queue_all(h); - frame = mm_waiton(h); - if (-1 == frame) - return NULL; - memset(&h->buf_me[frame].info,0,sizeof(h->buf_me[frame].info)); - h->buf_me[frame].refcount++; - h->buf_me[frame].info.ts = ng_get_timestamp() - h->start; - return h->buf_me+frame; - } -} - -/* ---------------------------------------------------------------------- */ - -struct ng_video_buf* -v4l_getimage(void *handle) -{ - struct v4l_handle *h = handle; - struct ng_video_buf* buf = NULL; - int frame; - - if (ng_debug) - fprintf(stderr,"v4l: getimage\n"); - - if (0 != h->fps) { - fprintf(stderr,"v4l: getimage: fps != 0\n"); - return NULL; - } - if (h->use_read) { - v4l_overlay_set(h,0); - buf = read_getframe(h); - v4l_overlay_set(h,h->ov_enabled); - return buf; - } else { - mm_queue(h); - frame = mm_waiton(h); - if (-1 == frame) - return NULL; - h->buf_me[frame].refcount++; - return h->buf_me+frame; - } -} - -/* ---------------------------------------------------------------------- */ - -extern void ng_plugin_init(void); -void ng_plugin_init(void) -{ - ng_vid_driver_register(NG_PLUGIN_MAGIC,__FILE__,&v4l_driver); -} _______________________________________________ linuxtv-commits mailing list [email protected] http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits
