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 obsolete libng/plugins/drv0-v4l2-old.c
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Fri Jan 28 21:03:56 2011 -0200

Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 libng/plugins/drv0-v4l2-old.c | 1262 -----------------------------------------
 1 files changed, 0 insertions(+), 1262 deletions(-)

---

http://git.linuxtv.org/xawtv3.git?a=commitdiff;h=a0b51156e1037e580ecb7cc6b050aa6e5f6049f0

diff --git a/libng/plugins/drv0-v4l2-old.c b/libng/plugins/drv0-v4l2-old.c
deleted file mode 100644
index dabea4e..0000000
--- a/libng/plugins/drv0-v4l2-old.c
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*
- * interface to the v4l2 driver
- *
- *   (c) 1998-2002 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 <sys/types.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <pthread.h>
-
-#include <asm/types.h>         /* XXX glibc */
-#include "videodev2-old.h"
-
-#include "grab-ng.h"
-
-/* ---------------------------------------------------------------------- */
-
-/* open+close */
-static void*   v4l2_open(char *device);
-static int     v4l2_close(void *handle);
-
-/* attributes */
-static char*   v4l2_devname(void *handle);
-static int     v4l2_flags(void *handle);
-static struct ng_attribute* v4l2_attrs(void *handle);
-static int     v4l2_read_attr(struct ng_attribute*);
-static void    v4l2_write_attr(struct ng_attribute*, int val);
-
-/* overlay */
-static int   v4l2_setupfb(void *handle, struct ng_video_fmt *fmt, void *base);
-static int   v4l2_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y,
-                         struct OVERLAY_CLIP *oc, int count, int aspect);
-
-/* capture video */
-static int v4l2_setformat(void *handle, struct ng_video_fmt *fmt);
-static int v4l2_startvideo(void *handle, int fps, unsigned int buffers);
-static void v4l2_stopvideo(void *handle);
-static struct ng_video_buf* v4l2_nextframe(void *handle);
-static struct ng_video_buf* v4l2_getimage(void *handle);
-
-/* tuner */
-static unsigned long v4l2_getfreq(void *handle);
-static void v4l2_setfreq(void *handle, unsigned long freq);
-static int v4l2_tuned(void *handle);
-
-/* ---------------------------------------------------------------------- */
-
-#define WANTED_BUFFERS 32
-
-#define MAX_INPUT   16
-#define MAX_NORM    16
-#define MAX_FORMAT  32
-#define MAX_CTRL    32
-
-struct v4l2_handle {
-    int                         fd;
-
-    /* device descriptions */
-    unsigned int                ninputs,nstds,nfmts;
-    struct v4l2_capability     cap;
-    struct v4l2_streamparm     streamparm;
-    struct v4l2_input          inp[MAX_INPUT];
-    struct v4l2_enumstd                std[MAX_NORM];
-    struct v4l2_fmtdesc                fmt[MAX_FORMAT];
-    struct v4l2_queryctrl      ctl[MAX_CTRL*2];
-
-    /* attributes */
-    int                         nattr;
-    struct ng_attribute         *attr;
-
-    /* capture */
-    int                            fps,first;
-    long long                      start;
-    struct v4l2_format             fmt_v4l2;
-    struct ng_video_fmt            fmt_me;
-    struct v4l2_requestbuffers     reqbufs;
-    struct v4l2_buffer             buf_v4l2[WANTED_BUFFERS];
-    struct ng_video_buf            buf_me[WANTED_BUFFERS];
-    int                            queue,waiton;
-
-    /* overlay */
-    struct v4l2_framebuffer        ov_fb;
-    struct v4l2_window             ov_win;
-    struct v4l2_clip               ov_clips[256];
-    int                            ov_error;
-    int                            ov_enabled;
-    int                            ov_on;
-};
-
-/* ---------------------------------------------------------------------- */
-
-struct ng_vid_driver v4l2_driver = {
-    name:          "v4l2-old",
-    open:          v4l2_open,
-    close:         v4l2_close,
-
-    get_devname:   v4l2_devname,
-    capabilities:  v4l2_flags,
-    list_attrs:    v4l2_attrs,
-
-    setupfb:       v4l2_setupfb,
-    overlay:       v4l2_overlay,
-
-    setformat:     v4l2_setformat,
-    startvideo:    v4l2_startvideo,
-    stopvideo:     v4l2_stopvideo,
-    nextframe:     v4l2_nextframe,
-    getimage:      v4l2_getimage,
-    
-    getfreq:       v4l2_getfreq,
-    setfreq:       v4l2_setfreq,
-    is_tuned:      v4l2_tuned,
-};
-
-static __u32 xawtv_pixelformat[VIDEO_FMT_COUNT] = {
-    0,                    /* unused   */
-    V4L2_PIX_FMT_HI240,   /* RGB8     */
-    V4L2_PIX_FMT_GREY,    /* GRAY8    */
-    V4L2_PIX_FMT_RGB555,  /* RGB15_LE */
-    V4L2_PIX_FMT_RGB565,  /* RGB16_LE */
-    V4L2_PIX_FMT_RGB555X, /* RGB15_BE */
-    V4L2_PIX_FMT_RGB565X, /* RGB16_BE */
-    V4L2_PIX_FMT_BGR24,   /* BGR24    */
-    V4L2_PIX_FMT_BGR32,   /* BGR32    */
-    V4L2_PIX_FMT_RGB24,   /* RGB24    */
-    0,                    /* RGB32    */
-    0,                    /* LUT 2    */
-    0,                    /* LUT 4    */
-    V4L2_PIX_FMT_YUYV,    /* YUV422   */
-    V4L2_PIX_FMT_YUV422P, /* YUV422P  */
-    V4L2_PIX_FMT_YUV420,  /* YUV420P  */
-};
-
-static struct STRTAB stereo[] = {
-    {  V4L2_TUNER_MODE_MONO,   "mono"    },
-    {  V4L2_TUNER_MODE_STEREO, "stereo"  },
-    {  V4L2_TUNER_MODE_LANG1,  "lang1"   },
-    {  V4L2_TUNER_MODE_LANG2,  "lang2"   },
-    { -1, NULL },
-};
-
-/* ---------------------------------------------------------------------- */
-/* debug output                                                           */
-
-#define PREFIX "ioctl: "
-
-static const char *io_names[] = {
-    "QUERYCAP", "1", "ENUM_PIXFMT", "ENUM_FBUFFMT", "G_FMT", "S_FMT",
-    "G_COMP", "S_COMP", "REQBUFS", "QUERYBUF", "G_FBUF", "S_FBUF",
-    "G_WIN", "S_WIN", "PREVIEW", "QBUF", "16", "DQBUF", "STREAMON",
-    "STREAMOFF", "G_PERF", "G_PARM", "S_PARM", "G_STD", "S_STD",
-    "ENUMSTD", "ENUMINPUT", "G_CTRL", "S_CTRL", "G_TUNER", "S_TUNER",
-    "G_FREQ", "S_FREQ", "G_AUDIO", "S_AUDIO", "35", "QUERYCTRL",
-    "QUERYMENU", "G_INPUT", "S_INPUT", "ENUMCVT", "41", "42", "43",
-    "44", "45",  "G_OUTPUT", "S_OUTPUT", "ENUMOUTPUT", "G_AUDOUT",
-    "S_AUDOUT", "ENUMFX", "G_EFFECT", "S_EFFECT", "G_MODULATOR",
-    "S_MODULATOR"
-};
-static const int io_count = (sizeof(io_names)/sizeof(char*));
-#define IONAME(cmd)    ((cmd & 0xff) < io_count ? \
-                       io_names[cmd & 0xff] : "UNKNOWN")
-
-static int
-xioctl(int fd, int cmd, void *arg, int mayfail)
-{
-    int rc;
-
-    rc = ioctl(fd,cmd,arg);
-    if (0 == rc && ng_debug < 2)
-       return rc;
-    if (mayfail && errno == mayfail && ng_debug < 2)
-       return rc;
-    switch (cmd) {
-    case VIDIOC_QUERYCAP:
-    {
-       struct v4l2_capability *a = arg;
-       fprintf(stderr,PREFIX "VIDIOC_QUERYCAP(%s,type=0x%x,in=%d,out=%d,"
-               "audio=%d,size=%dx%d-%dx%d,fps=%d,flags=0x%x)",
-               a->name,a->type,a->inputs,a->outputs,a->audios,
-               a->minwidth,a->minheight,a->maxwidth,a->maxheight,
-               a->maxframerate,a->flags);
-       break;
-    }
-    
-    case VIDIOC_G_FMT:
-    case VIDIOC_S_FMT:
-    {
-       struct v4l2_format *a = arg;
-
-       fprintf(stderr,PREFIX "VIDIOC_%s(type=%d,",IONAME(cmd),a->type);
-       switch (a->type) {
-       case V4L2_BUF_TYPE_CAPTURE:
-           fprintf(stderr,
-                   "%dx%d,depth=%d,%c%c%c%c,flags=0x%x,bpl=%d,size=%d)",
-                   a->fmt.pix.width,a->fmt.pix.height,a->fmt.pix.depth,
-                   a->fmt.pix.pixelformat & 0xff,
-                   (a->fmt.pix.pixelformat >>  8) & 0xff,
-                   (a->fmt.pix.pixelformat >> 16) & 0xff,
-                   (a->fmt.pix.pixelformat >> 24) & 0xff,
-                   a->fmt.pix.depth,a->fmt.pix.bytesperline,
-                   a->fmt.pix.sizeimage);
-           break;
-       default:
-           fprintf(stderr,"??" "?)"); /* break trigraph */
-           break;
-       }
-       break;
-    }
-    case VIDIOC_REQBUFS:
-    {
-       struct v4l2_requestbuffers *a = arg;
-       
-       fprintf(stderr,PREFIX "VIDIOC_REQBUFS(count=%d,type=%d)",
-               a->count,a->type);
-       break;
-    }
-    case VIDIOC_QBUF:
-    case VIDIOC_DQBUF:
-    {
-       struct v4l2_buffer *a = arg;
-       
-       fprintf(stderr,PREFIX "VIDIOC_%s(%d,type=%d,off=%d,len=%d,used=%d,"
-               "flags=0x%x,ts=%Ld,seq=%d)",
-               IONAME(cmd),a->index,a->type,a->offset,a->length,
-               a->bytesused,a->flags,a->timestamp,a->sequence);
-       break;
-    }
-    
-    case VIDIOC_G_WIN:
-    case VIDIOC_S_WIN:
-    {
-       struct v4l2_window *a = arg;
-       
-       fprintf(stderr,PREFIX "VIDIOC_%s(%dx%d+%d+%d,key=0x%x,clips=%d)",
-               IONAME(cmd), a->width, a->height, a->x, a->y,
-               a->chromakey,a->clipcount);
-       break;
-    }
-    case VIDIOC_PREVIEW:
-    {
-       int *a = arg;
-
-       fprintf(stderr,PREFIX "VIDIOC_PREVIEW(%s)",*a ? "on" : "off");
-       break;
-    }
-    
-    case VIDIOC_QUERYCTRL:
-    {
-       struct v4l2_queryctrl *a = arg;
-       
-       fprintf(stderr,PREFIX "VIDIOC_QUERYCTRL(id=%d,%s,%d-%d/%d,def=%d,"
-               "type=%d,flags=0x%x)",
-               a->id,a->name,a->minimum,a->maximum,a->step,
-               a->default_value,a->type,a->flags);
-       break;
-    }
-    case VIDIOC_QUERYMENU:
-    {
-       struct v4l2_querymenu *a = arg;
-
-       fprintf(stderr,PREFIX "VIDIOC_QUERYMENU(id=%d,index=%d,%s)",
-               a->id,a->index,a->name);
-       break;
-    }
-    case VIDIOC_G_CTRL:
-    case VIDIOC_S_CTRL:
-    {
-       struct v4l2_control *a = arg;
-       
-       fprintf(stderr,PREFIX "VIDIOC_%s(id=%d,value=%d)",
-               IONAME(cmd),a->id,a->value);
-       break;
-    }
-    
-    default:
-       fprintf(stderr,PREFIX "VIDIOC_%s(cmd=0x%x)",IONAME(cmd),cmd);
-       break;
-    }
-    fprintf(stderr,": %s\n",(rc == 0) ? "ok" : strerror(errno));
-    return rc;
-}
-
-static void
-print_bits(char *title, char **names, int count, int value)
-{
-    int i;
-    
-    fprintf(stderr,"%s: ",title);
-    for (i = 0; i < count; i++) {
-       if (value & (1 << i))
-           fprintf(stderr,"%s ",names[i]);
-    }
-    fprintf(stderr,"\n");
-}    
-
-static void
-print_device_capabilities(struct v4l2_handle *h)
-{
-    static char *cap_type[] = {
-       "capture",
-       "codec",
-       "output",
-       "fx",
-       "vbi",
-       "vtr",
-       "vtx",
-       "radio",
-    };
-    static char *cap_flags[] = {
-       "read",
-       "write",
-       "streaming",
-       "preview",
-       "select",
-       "tuner",
-       "monochrome",
-       "teletext"
-    };
-    static char *ctl_type[] = {
-       "integer",
-       "boolean",
-       "menu"
-    };
-    static char *cap_parm[] = {
-       "highquality",
-       "vflip",
-       "hflip"
-    };
-
-    unsigned int i;
-
-    fprintf(stderr,"\n*** v4l2: video device capabilities ***\n");
-
-    /* capabilities */
-    fprintf(stderr, "type: %s\n", h->cap.type < SDIMOF(cap_type)
-           ? cap_type[h->cap.type] : "unknown");
-    print_bits("flags",cap_flags,DIMOF(cap_flags),h->cap.flags);
-    fprintf(stderr,"\n");
-    fprintf(stderr,"inputs: %d\naudios: %d\n",h->cap.inputs,h->cap.audios);
-    fprintf(stderr,"size: %dx%d => %dx%d\n",
-           h->cap.minwidth,h->cap.minheight,h->cap.maxwidth,h->cap.maxheight);
-    fprintf(stderr,"fps: %d max\n",h->cap.maxframerate);
-
-    /* inputs */
-    fprintf(stderr,"video inputs:\n");
-    for (i = 0; i < h->ninputs; i++) {
-       printf("  %d: \"%s\", tuner: %s, audio: %s\n", i, h->inp[i].name,
-              (h->inp[i].type       == V4L2_INPUT_TYPE_TUNER) ? "yes" : "no",
-              (h->inp[i].capability &  V4L2_INPUT_CAP_AUDIO)  ? "yes" : "no");
-    }
-
-    /* video standards */
-    fprintf(stderr,"video standards:\n");
-    for (i = 0; i < h->nstds; i++) {
-       printf("  %d: \"%s\"\n", i, h->std[i].std.name);
-    }
-
-    /* capture formats */
-    fprintf(stderr,"capture formats:\n");
-    for (i = 0; i < h->nfmts; i++) {
-       fprintf(stderr,"  %d: %c%c%c%c, depth=%d,%s \"%s\"\n", i,
-               h->fmt[i].pixelformat & 0xff,
-               (h->fmt[i].pixelformat >>  8) & 0xff,
-               (h->fmt[i].pixelformat >> 16) & 0xff,
-               (h->fmt[i].pixelformat >> 24) & 0xff,
-               h->fmt[i].depth,
-               (h->fmt[i].flags & V4L2_FMT_FLAG_COMPRESSED) ? " compressed" : 
"",
-               h->fmt[i].description);
-    }
-
-    /* capture parameters */
-    fprintf(stderr,"capture parameters:\n");
-    print_bits("  cap",cap_parm,sizeof(cap_parm)/sizeof(char*),
-              h->streamparm.parm.capture.capability);
-    print_bits("  cur",cap_parm,sizeof(cap_parm)/sizeof(char*),
-              h->streamparm.parm.capture.capturemode);
-    fprintf(stderr,"  timeperframe=%ld\n",
-           h->streamparm.parm.capture.timeperframe);
-
-    /* controls */
-    fprintf(stderr,"supported controls:\n");
-    for (i = 0; i < MAX_CTRL*2; i++) {
-       if (h->ctl[i].id == UNSET)
-           continue;
-       fprintf(stderr,"  %2d: \"%s\", [%d .. %d], step=%d, def=%d, type=%s\n",
-               i, h->ctl[i].name,
-               h->ctl[i].minimum,h->ctl[i].maximum,
-               h->ctl[i].step,h->ctl[i].default_value,
-               ctl_type[h->ctl[i].type]);
-    }
-    fprintf(stderr,"\n");
-}
-
-static void
-print_bufinfo(struct v4l2_buffer *buf)
-{
-    static char *type[] = {
-       "",
-       "capture",
-       "codec in",
-       "codec out",
-       "effects in1",
-       "effects in2",
-       "effects out",
-       "video out"
-    };
-
-    fprintf(stderr,"v4l2: buf %d: %s 0x%x+%d, used %d\n",
-                  buf->index,
-                  buf->type < sizeof(type)/sizeof(char*) ?
-                       type[buf->type] : "unknown",
-                  buf->offset,buf->length,buf->bytesused);
-}
-
-static void
-print_fbinfo(struct v4l2_framebuffer *fb)
-{
-    static char *fb_cap[] = {
-       "extern",
-       "chromakey",
-       "clipping",
-       "scale-up",
-       "scale-down"
-    };
-    static char *fb_flags[] = {
-       "primary",
-       "overlay",
-       "chromakey"
-    };
-
-    /* capabilities */
-    fprintf(stderr,"v4l2: framebuffer info\n");
-    print_bits("  cap",fb_cap,sizeof(fb_cap)/sizeof(char*),fb->capability);
-    print_bits("  flags",fb_cap,sizeof(fb_flags)/sizeof(char*),fb->flags);
-    fprintf(stderr,"  base: %p %p %p\n",fb->base[0],fb->base[1],fb->base[2]);
-    fprintf(stderr,"  format: %dx%d, %c%c%c%c, %d byte\n",
-           fb->fmt.width, fb->fmt.height,
-           fb->fmt.pixelformat & 0xff,
-           (fb->fmt.pixelformat >>  8) & 0xff,
-           (fb->fmt.pixelformat >> 16) & 0xff,
-           (fb->fmt.pixelformat >> 24) & 0xff,
-           fb->fmt.sizeimage);
-}
-
-/* ---------------------------------------------------------------------- */
-/* helpers                                                                */
-
-static void
-get_device_capabilities(struct v4l2_handle *h)
-{
-    unsigned int i;
-    
-    for (h->ninputs = 0; h->ninputs < h->cap.inputs; h->ninputs++) {
-       h->inp[h->ninputs].index = h->ninputs;
-       if (-1 == xioctl(h->fd, VIDIOC_ENUMINPUT, &h->inp[h->ninputs], 0))
-           break;
-    }
-    for (h->nstds = 0; h->nstds < MAX_NORM; h->nstds++) {
-       h->std[h->nstds].index = h->nstds;
-       if (-1 == xioctl(h->fd, VIDIOC_ENUMSTD, &h->std[h->nstds], EINVAL))
-           break;
-    }
-    for (h->nfmts = 0; h->nfmts < MAX_FORMAT; h->nfmts++) {
-       h->fmt[h->nfmts].index = h->nfmts;
-       if (-1 == xioctl(h->fd, VIDIOC_ENUM_PIXFMT, &h->fmt[h->nfmts], EINVAL))
-           break;
-    }
-
-    h->streamparm.type = V4L2_BUF_TYPE_CAPTURE;
-    ioctl(h->fd,VIDIOC_G_PARM,&h->streamparm);
-
-    /* controls */
-    for (i = 0; i < MAX_CTRL; i++) {
-       h->ctl[i].id = V4L2_CID_BASE+i;
-       if (-1 == xioctl(h->fd, VIDIOC_QUERYCTRL, &h->ctl[i], EINVAL) ||
-           (h->ctl[i].flags & V4L2_CTRL_FLAG_DISABLED))
-           h->ctl[i].id = -1;
-    }
-    for (i = 0; i < MAX_CTRL; i++) {
-       h->ctl[i+MAX_CTRL].id = V4L2_CID_PRIVATE_BASE+i;
-       if (-1 == xioctl(h->fd, VIDIOC_QUERYCTRL, &h->ctl[i+MAX_CTRL], EINVAL) 
||
-           (h->ctl[i+MAX_CTRL].flags & V4L2_CTRL_FLAG_DISABLED))
-           h->ctl[i+MAX_CTRL].id = -1;
-    }
-}
-
-static struct STRTAB *
-build_norms(struct v4l2_handle *h)
-{
-    struct STRTAB *norms;
-    unsigned int i;
-
-    norms = malloc(sizeof(struct STRTAB) * (h->nstds+1));
-    for (i = 0; i < h->nstds; i++) {
-       norms[i].nr  = i;
-       norms[i].str = h->std[i].std.name;
-    }
-    norms[i].nr  = -1;
-    norms[i].str = NULL;
-    return norms;
-}
-
-static struct STRTAB *
-build_inputs(struct v4l2_handle *h)
-{
-    struct STRTAB *inputs;
-    unsigned int i;
-
-    inputs = malloc(sizeof(struct STRTAB) * (h->ninputs+1));
-    for (i = 0; i < h->ninputs; i++) {
-       inputs[i].nr  = i;
-       inputs[i].str = h->inp[i].name;
-    }
-    inputs[i].nr  = -1;
-    inputs[i].str = NULL;
-    return inputs;
-}
-
-/* ---------------------------------------------------------------------- */
-
-static struct V4L2_ATTR {
-    unsigned int id;
-    unsigned int v4l2;
-} v4l2_attr[] = {
-    { ATTR_ID_VOLUME,   V4L2_CID_AUDIO_VOLUME },
-    { ATTR_ID_MUTE,     V4L2_CID_AUDIO_MUTE   },
-    { ATTR_ID_COLOR,    V4L2_CID_SATURATION   },
-    { ATTR_ID_BRIGHT,   V4L2_CID_BRIGHTNESS   },
-    { ATTR_ID_HUE,      V4L2_CID_HUE          },
-    { ATTR_ID_CONTRAST, V4L2_CID_CONTRAST     },
-};
-#define NUM_ATTR (sizeof(v4l2_attr)/sizeof(struct V4L2_ATTR))
-
-static struct STRTAB*
-v4l2_menu(int fd, const struct v4l2_queryctrl *ctl)
-{
-    struct STRTAB *menu;
-    struct v4l2_querymenu item;
-    int i;
-
-    menu = malloc(sizeof(struct STRTAB) * (ctl->maximum-ctl->minimum+2));
-    for (i = ctl->minimum; i <= ctl->maximum; i++) {
-       item.id = ctl->id;
-       item.index = i;
-       if (-1 == xioctl(fd, VIDIOC_QUERYMENU, &item, 0)) {
-           free(menu);
-           return NULL;
-       }
-       menu[i-ctl->minimum].nr  = i;
-       menu[i-ctl->minimum].str = strdup(item.name);
-    }
-    menu[i-ctl->minimum].nr  = -1;
-    menu[i-ctl->minimum].str = NULL;
-    return menu;
-}
-
-static void
-v4l2_add_attr(struct v4l2_handle *h, struct v4l2_queryctrl *ctl,
-             int id, struct STRTAB *choices)
-{
-    static int private_ids = ATTR_ID_COUNT;
-    unsigned int i;
-    
-    h->attr = realloc(h->attr,(h->nattr+2) * sizeof(struct ng_attribute));
-    memset(h->attr+h->nattr,0,sizeof(struct ng_attribute)*2);
-    if (ctl) {
-       for (i = 0; i < NUM_ATTR; i++)
-           if (v4l2_attr[i].v4l2 == ctl->id)
-               break;
-       if (i != NUM_ATTR) {
-           h->attr[h->nattr].id  = v4l2_attr[i].id;
-       } else {
-           h->attr[h->nattr].id  = private_ids++;
-       }
-       h->attr[h->nattr].name    = ctl->name;
-       h->attr[h->nattr].priv    = ctl;
-       h->attr[h->nattr].defval  = ctl->default_value;
-       switch (ctl->type) {
-       case V4L2_CTRL_TYPE_INTEGER:
-           h->attr[h->nattr].type    = ATTR_TYPE_INTEGER;
-           h->attr[h->nattr].defval  = ctl->default_value;
-           h->attr[h->nattr].min     = ctl->minimum;
-           h->attr[h->nattr].max     = ctl->maximum;
-           break;
-       case V4L2_CTRL_TYPE_BOOLEAN:
-           h->attr[h->nattr].type    = ATTR_TYPE_BOOL;
-           break;
-       case V4L2_CTRL_TYPE_MENU:
-           h->attr[h->nattr].type    = ATTR_TYPE_CHOICE;
-           h->attr[h->nattr].choices = v4l2_menu(h->fd, ctl);
-           break;
-       default:
-           return;
-       }
-    } else {
-       /* for norms + inputs */
-       h->attr[h->nattr].id      = id;
-       h->attr[h->nattr].defval  = 0;
-       h->attr[h->nattr].type    = ATTR_TYPE_CHOICE;
-       h->attr[h->nattr].choices = choices;
-    }
-    if (h->attr[h->nattr].id < ATTR_ID_COUNT)
-       h->attr[h->nattr].name = ng_attr_to_desc[h->attr[h->nattr].id];
-
-    h->attr[h->nattr].read    = v4l2_read_attr;
-    h->attr[h->nattr].write   = v4l2_write_attr;
-    h->attr[h->nattr].handle  = h;
-    h->nattr++;
-}
-
-static int v4l2_read_attr(struct ng_attribute *attr)
-{
-    struct v4l2_handle *h = attr->handle;
-    const struct v4l2_queryctrl *ctl = attr->priv;
-    struct v4l2_control c;
-    struct v4l2_tuner tuner;
-    int value = 0;
-
-    if (NULL != ctl) {
-       c.id = ctl->id;
-       xioctl(h->fd,VIDIOC_G_CTRL,&c,0);
-       value = c.value;
-       
-    } else if (attr->id == ATTR_ID_NORM) {
-       value = -1; /* FIXME */
-       
-    } else if (attr->id == ATTR_ID_INPUT) {
-       xioctl(h->fd,VIDIOC_G_INPUT,&value,0);
-
-    } else if (attr->id == ATTR_ID_AUDIO_MODE) {
-       memset(&tuner,0,sizeof(tuner));
-       xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0);
-       value = tuner.audmode;
-#if 1
-       if (ng_debug) {
-           fprintf(stderr,"v4l2:   tuner cap:%s%s%s\n",
-                   (tuner.capability&V4L2_TUNER_CAP_STEREO) ? " STEREO" : "",
-                   (tuner.capability&V4L2_TUNER_CAP_LANG1)  ? " LANG1"  : "",
-                   (tuner.capability&V4L2_TUNER_CAP_LANG2)  ? " LANG2"  : "");
-           fprintf(stderr,"v4l2:   tuner rxs:%s%s%s%s\n",
-                   (tuner.rxsubchans&V4L2_TUNER_SUB_MONO)   ? " MONO"   : "",
-                   (tuner.rxsubchans&V4L2_TUNER_SUB_STEREO) ? " STEREO" : "",
-                   (tuner.rxsubchans&V4L2_TUNER_SUB_LANG1)  ? " LANG1"  : "",
-                   (tuner.rxsubchans&V4L2_TUNER_SUB_LANG2)  ? " LANG2"  : "");
-           fprintf(stderr,"v4l2:   tuner cur:%s%s%s%s\n",
-                   (tuner.audmode==V4L2_TUNER_MODE_MONO)   ? " MONO"   : "",
-                   (tuner.audmode==V4L2_TUNER_MODE_STEREO) ? " STEREO" : "",
-                   (tuner.audmode==V4L2_TUNER_MODE_LANG1)  ? " LANG1"  : "",
-                   (tuner.audmode==V4L2_TUNER_MODE_LANG2)  ? " LANG2"  : "");
-       }
-#endif
-    }
-    return value;
-}
-
-static void v4l2_write_attr(struct ng_attribute *attr, int value)
-{
-    struct v4l2_handle *h = attr->handle;
-    const struct v4l2_queryctrl *ctl = attr->priv;
-    struct v4l2_control c;
-    struct v4l2_tuner tuner;
-
-    if (NULL != ctl) {
-       c.id = ctl->id;
-       c.value = value;
-       xioctl(h->fd,VIDIOC_S_CTRL,&c,0);
-       
-    } else if (attr->id == ATTR_ID_NORM) {
-       xioctl(h->fd,VIDIOC_S_STD,&h->std[value].std,0);
-       
-    } else if (attr->id == ATTR_ID_INPUT) {
-       xioctl(h->fd,VIDIOC_S_INPUT,&value,0);
-
-    } else if (attr->id == ATTR_ID_AUDIO_MODE) {
-       memset(&tuner,0,sizeof(tuner));
-       xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0);
-       tuner.audmode = value;
-       xioctl(h->fd,VIDIOC_S_TUNER,&tuner,0);
-    }
-}
-
-/* ---------------------------------------------------------------------- */
-
-static void*
-v4l2_open(char *device)
-{
-    struct v4l2_handle *h;
-    int i;
-
-    h = malloc(sizeof(*h));
-    if (NULL == h)
-       return NULL;
-    memset(h,0,sizeof(*h));
-    
-    if (-1 == (h->fd = open(device, O_RDWR))) {
-       fprintf(stderr,"v4l2: open %s: %s\n",device,strerror(errno));
-       goto err;
-    }
-
-    if (-1 == ioctl(h->fd,VIDIOC_QUERYCAP,&h->cap))
-       goto err;
-    if (ng_debug)
-       fprintf(stderr, "v4l2: open\n");
-    fcntl(h->fd,F_SETFD,FD_CLOEXEC);
-    if (ng_debug)
-       fprintf(stderr,"v4l2: device is %s\n",h->cap.name);
-
-    get_device_capabilities(h);
-    if (ng_debug)
-       print_device_capabilities(h);
-
-    /* attributes */
-    v4l2_add_attr(h, NULL, ATTR_ID_NORM,  build_norms(h));
-    v4l2_add_attr(h, NULL, ATTR_ID_INPUT, build_inputs(h));
-    if (h->cap.flags & V4L2_FLAG_TUNER)
-       v4l2_add_attr(h, NULL, ATTR_ID_AUDIO_MODE, stereo);
-    for (i = 0; i < MAX_CTRL*2; i++) {
-       if (h->ctl[i].id == UNSET)
-           continue;
-       v4l2_add_attr(h, &h->ctl[i], 0, NULL);
-    }
-
-    /* capture buffers */
-    for (i = 0; i < WANTED_BUFFERS; i++) {
-       ng_init_video_buf(h->buf_me+i);
-       h->buf_me[i].release = ng_wakeup_video_buf;
-    }
-
-    return h;
-
- err:
-    if (h->fd != -1)
-       close(h->fd);
-    if (h)
-       free(h);
-    return NULL;
-}
-
-static int
-v4l2_close(void *handle)
-{
-    struct v4l2_handle *h = handle;
-
-    if (ng_debug)
-       fprintf(stderr, "v4l2: close\n");
-
-    close(h->fd);
-    free(h);
-    return 0;
-}
-
-static char*
-v4l2_devname(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    return h->cap.name;
-}
-
-static int v4l2_flags(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    int ret = 0;
-
-    if (h->cap.flags & V4L2_FLAG_PREVIEW && !h->ov_error)
-       ret |= CAN_OVERLAY;
-    if ((h->cap.flags & V4L2_FLAG_STREAMING) ||
-       (h->cap.flags & V4L2_FLAG_READ))
-       ret |= CAN_CAPTURE;
-    if (h->cap.flags & V4L2_FLAG_TUNER)
-       ret |= CAN_TUNE;
-    return ret;
-}
-
-static struct ng_attribute* v4l2_attrs(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    return h->attr;
-}
-
-/* ---------------------------------------------------------------------- */
-
-static unsigned long
-v4l2_getfreq(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    unsigned long freq;
-
-    xioctl(h->fd, VIDIOC_G_FREQ, &freq, 0);
-    return freq;
-}
-
-static void
-v4l2_setfreq(void *handle, unsigned long freq)
-{
-    struct v4l2_handle *h = handle;
-
-    if (ng_debug)
-       fprintf(stderr,"v4l2: freq: %.3f\n",(float)freq/16);
-    xioctl(h->fd, VIDIOC_S_FREQ, &freq, 0);
-}
-
-static int
-v4l2_tuned(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    struct v4l2_tuner tuner;
-
-    usleep(10000);
-    if (-1 == xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0))
-       return 0;
-    return tuner.signal ? 1 : 0;
-}
-
-/* ---------------------------------------------------------------------- */
-/* overlay                                                                */
-
-static int
-v4l2_setupfb(void *handle, struct ng_video_fmt *fmt, void *base)
-{
-    struct v4l2_handle *h = handle;
-
-    if (-1 == xioctl(h->fd, VIDIOC_G_FBUF, &h->ov_fb, 0))
-       return -1;
-    
-    if (1 /* ng_debug */)
-       print_fbinfo(&h->ov_fb);
-
-    /* double-check settings */
-    if (NULL != base && h->ov_fb.base[0] != base) {
-       fprintf(stderr,"v4l2: WARNING: framebuffer base address mismatch\n");
-       fprintf(stderr,"v4l2: me=%p v4l=%p\n",base,h->ov_fb.base);
-       h->ov_error = 1;
-       return -1;
-    }
-    if (h->ov_fb.fmt.width  != fmt->width ||
-       h->ov_fb.fmt.height != fmt->height) {
-       fprintf(stderr,"v4l2: WARNING: framebuffer size mismatch\n");
-       fprintf(stderr,"v4l2: me=%dx%d v4l=%dx%d\n",
-               fmt->width,fmt->height,h->ov_fb.fmt.width,h->ov_fb.fmt.height);
-       h->ov_error = 1;
-       return -1;
-    }
-    if ((h->ov_fb.fmt.flags & V4L2_FMT_FLAG_BYTESPERLINE) &&
-       fmt->bytesperline >  0 &&
-       fmt->bytesperline != h->ov_fb.fmt.bytesperline) {
-       fprintf(stderr,"v4l2: WARNING: framebuffer bpl mismatch\n");
-       fprintf(stderr,"v4l2: me=%d v4l=%d\n",
-               fmt->bytesperline,h->ov_fb.fmt.bytesperline);
-       h->ov_error = 1;
-       return -1;
-    }
-#if 0
-    if (h->ov_fb.fmt.pixelformat != xawtv_pixelformat[fmt->fmtid]) {
-       fprintf(stderr,"v4l2: WARNING: framebuffer format mismatch\n");
-       fprintf(stderr,"v4l2: me=%c%c%c%c [%s]   v4l=%c%c%c%c\n",
-               xawtv_pixelformat[fmt->fmtid] & 0xff,
-               (xawtv_pixelformat[fmt->fmtid] >>  8) & 0xff,
-               (xawtv_pixelformat[fmt->fmtid] >> 16) & 0xff,
-               (xawtv_pixelformat[fmt->fmtid] >> 24) & 0xff,
-               ng_vfmt_to_desc[fmt->fmtid],
-               h->ov_fb.fmt.pixelformat & 0xff,
-               (h->ov_fb.fmt.pixelformat >>  8) & 0xff,
-               (h->ov_fb.fmt.pixelformat >> 16) & 0xff,
-               (h->ov_fb.fmt.pixelformat >> 24) & 0xff);
-       h->ov_error = 1;
-       return -1;
-    }
-#endif
-    return 0;
-}
-
-static int
-v4l2_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y,
-            struct OVERLAY_CLIP *oc, int count, int aspect)
-{
-    struct v4l2_handle *h = handle;
-    int rc,i;
-
-    if (h->ov_error)
-       return -1;
-    
-    if (NULL == fmt) {
-       if (ng_debug)
-           fprintf(stderr,"v4l2: overlay off\n");
-       if (h->ov_enabled) {
-           h->ov_enabled = 0;
-           h->ov_on = 0;
-           xioctl(h->fd, VIDIOC_PREVIEW, &h->ov_on, 0);
-       }
-       return 0;
-    }
-
-    if (ng_debug)
-       fprintf(stderr,"v4l2: overlay win=%dx%d+%d+%d, %d clips\n",
-               fmt->width,fmt->height,x,y,count);
-    h->ov_win.x          = x;
-    h->ov_win.y          = y;
-    h->ov_win.width      = fmt->width;
-    h->ov_win.height     = fmt->height;
-
-    /* check against max. size */
-    ioctl(h->fd,VIDIOC_QUERYCAP,&h->cap);
-    if (h->ov_win.width > h->cap.maxwidth) {
-       h->ov_win.width = h->cap.maxwidth;
-       h->ov_win.x += (fmt->width - h->ov_win.width)/2;
-    }
-    if (h->ov_win.height > h->cap.maxheight) {
-       h->ov_win.height = h->cap.maxheight;
-       h->ov_win.y +=  (fmt->height - h->ov_win.height)/2;
-    }
-    if (aspect)
-       ng_ratio_fixup(&h->ov_win.width,&h->ov_win.height,
-                      &h->ov_win.x,&h->ov_win.y);
-
-    /* fixups */
-    ng_check_clipping(h->ov_win.width, h->ov_win.height,
-                     x - h->ov_win.x, y - h->ov_win.y,
-                     oc, &count);
-
-    if (h->ov_fb.capability & V4L2_FBUF_CAP_CLIPPING) {
-       h->ov_win.clips      = h->ov_clips;
-       h->ov_win.clipcount  = count;
-       
-       for (i = 0; i < count; i++) {
-           h->ov_clips[i].next   = (i+1 == count) ? NULL : &h->ov_clips[i+1];
-           h->ov_clips[i].x      = oc[i].x1;
-           h->ov_clips[i].y      = oc[i].y1;
-           h->ov_clips[i].width  = oc[i].x2-oc[i].x1;
-           h->ov_clips[i].height = oc[i].y2-oc[i].y1;
-       }
-    }
-#if 0
-    if (h->ov_fb.flags & V4L2_FBUF_FLAG_CHROMAKEY) {
-       h->ov_win.chromakey  = 0;    /* FIXME */
-    }
-#endif
-    rc = xioctl(h->fd, VIDIOC_S_WIN, &h->ov_win, 0);
-
-    h->ov_enabled = (0 == rc) ? 1 : 0;
-    h->ov_on      = (0 == rc) ? 1 : 0;
-    xioctl(h->fd, VIDIOC_PREVIEW, &h->ov_on, 0);
-
-    return 0;
-}
-
-/* ---------------------------------------------------------------------- */
-/* capture helpers                                                        */
-
-static int
-v4l2_queue_buffer(struct v4l2_handle *h)
-{
-    int frame = h->queue % h->reqbufs.count;
-    int rc;
-
-    if (0 != h->buf_me[frame].refcount) {
-       if (0 != h->queue - h->waiton)
-           return -1;
-       fprintf(stderr,"v4l2: waiting for a free buffer\n");
-       ng_waiton_video_buf(h->buf_me+frame);
-    }
-
-    rc = xioctl(h->fd,VIDIOC_QBUF,&h->buf_v4l2[frame], 0);
-    if (0 == rc)
-       h->queue++;
-    return rc;
-}
-
-static void
-v4l2_queue_all(struct v4l2_handle *h)
-{
-    for (;;) {
-       if (h->queue - h->waiton >= h->reqbufs.count)
-           return;
-       if (0 != v4l2_queue_buffer(h))
-           return;
-    }
-}
-
-static int
-v4l2_waiton(struct v4l2_handle *h)
-{
-    struct v4l2_buffer buf;
-    struct timeval tv;
-    fd_set rdset;
-    
-    /* wait for the next frame */
- again:
-    tv.tv_sec  = 5;
-    tv.tv_usec = 0;
-    FD_ZERO(&rdset);
-    FD_SET(h->fd, &rdset);
-    switch (select(h->fd + 1, &rdset, NULL, NULL, &tv)) {
-    case -1:
-       if (EINTR == errno)
-           goto again;
-       perror("v4l2: select");
-       return -1;
-    case  0:
-       fprintf(stderr,"v4l2: oops: select timeout\n");
-       return -1;
-    }
-
-    /* get it */
-    memset(&buf,0,sizeof(buf));
-    buf.type = V4L2_BUF_TYPE_CAPTURE;
-    if (-1 == xioctl(h->fd,VIDIOC_DQBUF,&buf, 0))
-       return -1;
-    h->waiton++;
-    h->buf_v4l2[buf.index] = buf;
-    return buf.index;
-}
-
-static int
-v4l2_start_streaming(struct v4l2_handle *h, int buffers)
-{
-    int disable_overlay = 0;
-    int i;
-    
-    /* setup buffers */
-    h->reqbufs.count = buffers;
-    h->reqbufs.type  = V4L2_BUF_TYPE_CAPTURE;
-    if (-1 == xioctl(h->fd, VIDIOC_REQBUFS, &h->reqbufs, 0))
-       return -1;
-    for (i = 0; i < h->reqbufs.count; i++) {
-       h->buf_v4l2[i].index = i;
-       h->buf_v4l2[i].type  = V4L2_BUF_TYPE_CAPTURE;
-       if (-1 == ioctl(h->fd, VIDIOC_QUERYBUF, &h->buf_v4l2[i]))
-           return -1;
-       h->buf_me[i].fmt  = h->fmt_me;
-       h->buf_me[i].size = h->buf_me[i].fmt.bytesperline *
-           h->buf_me[i].fmt.height;
-       h->buf_me[i].data = mmap(NULL, h->buf_v4l2[i].length,
-                                PROT_READ | PROT_WRITE, MAP_SHARED,
-                                h->fd, h->buf_v4l2[i].offset);
-       if ((void*)-1 == h->buf_me[i].data) {
-           perror("mmap");
-           return -1;
-       }
-       if (ng_debug)
-           print_bufinfo(&h->buf_v4l2[i]);
-    }
-
-    /* queue up all buffers */
-    v4l2_queue_all(h);
-
- try_again:
-    /* turn off preview (if needed) */
-    if (disable_overlay) {
-       h->ov_on = 0;
-       xioctl(h->fd, VIDIOC_PREVIEW, &h->ov_on, 0);
-       if (ng_debug)
-           fprintf(stderr,"v4l2: overlay off (start_streaming)\n");
-    }
-
-    /* start capture */
-    if (-1 == xioctl(h->fd,VIDIOC_STREAMON,&h->fmt_v4l2.type,
-                    h->ov_on ? EBUSY : 0)) {
-       if (h->ov_on && errno == EBUSY) {
-           disable_overlay = 1;
-           goto try_again;
-       }
-       return -1;
-    }
-    return 0;
-}
-
-static void
-v4l2_stop_streaming(struct v4l2_handle *h)
-{
-    int i;
-    
-    /* stop capture */
-    if (-1 == ioctl(h->fd,VIDIOC_STREAMOFF,&h->fmt_v4l2.type))
-       perror("ioctl VIDIOC_STREAMOFF");
-    
-    /* free buffers */
-    for (i = 0; i < h->reqbufs.count; i++) {
-       if (0 != h->buf_me[i].refcount)
-           ng_waiton_video_buf(&h->buf_me[i]);
-       if (-1 == munmap(h->buf_me[i].data,h->buf_me[i].size))
-           perror("munmap");
-    }
-    h->queue = 0;
-    h->waiton = 0;
-
-    /* turn on preview (if needed) */
-    if (h->ov_on != h->ov_enabled) {
-       h->ov_on = h->ov_enabled;
-       xioctl(h->fd, VIDIOC_PREVIEW, &h->ov_on, 0);
-       if (ng_debug)
-           fprintf(stderr,"v4l2: overlay on (stop_streaming)\n");
-    }
-}
-
-/* ---------------------------------------------------------------------- */
-/* capture interface                                                      */
-
-/* set capture parameters */
-static int
-v4l2_setformat(void *handle, struct ng_video_fmt *fmt)
-{
-    struct v4l2_handle *h = handle;
-    
-    h->fmt_v4l2.type = V4L2_BUF_TYPE_CAPTURE;
-    h->fmt_v4l2.fmt.pix.pixelformat  = xawtv_pixelformat[fmt->fmtid];
-    h->fmt_v4l2.fmt.pix.flags        = V4L2_FMT_FLAG_INTERLACED;
-    h->fmt_v4l2.fmt.pix.depth        = ng_vfmt_to_depth[fmt->fmtid];
-    h->fmt_v4l2.fmt.pix.width        = fmt->width;
-    h->fmt_v4l2.fmt.pix.height       = fmt->height;
-    h->fmt_v4l2.fmt.pix.bytesperline = fmt->bytesperline;
-
-    if (-1 == xioctl(h->fd, VIDIOC_S_FMT, &h->fmt_v4l2, EINVAL))
-       return -1;
-    if (h->fmt_v4l2.fmt.pix.pixelformat != xawtv_pixelformat[fmt->fmtid])
-       return -1;
-    fmt->width        = h->fmt_v4l2.fmt.pix.width;
-    fmt->height       = h->fmt_v4l2.fmt.pix.height;
-    fmt->bytesperline = h->fmt_v4l2.fmt.pix.bytesperline;
-    if (0 == fmt->bytesperline)
-       fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8;
-    h->fmt_me = *fmt;
-    if (ng_debug)
-       fprintf(stderr,"v4l2: new capture params (%dx%d, %c%c%c%c, %d byte)\n",
-               fmt->width,fmt->height,
-               h->fmt_v4l2.fmt.pix.pixelformat & 0xff,
-               (h->fmt_v4l2.fmt.pix.pixelformat >>  8) & 0xff,
-               (h->fmt_v4l2.fmt.pix.pixelformat >> 16) & 0xff,
-               (h->fmt_v4l2.fmt.pix.pixelformat >> 24) & 0xff,
-               h->fmt_v4l2.fmt.pix.sizeimage);
-    return 0;
-}
-
-/* start/stop video */
-static int
-v4l2_startvideo(void *handle, int fps, unsigned int buffers)
-{
-    struct v4l2_handle *h = handle;
-
-    if (0 != h->fps)
-       fprintf(stderr,"v4l2_startvideo: oops: fps!=0\n");
-    h->fps = fps;
-    h->first = 1;
-    h->start = 0;
-
-    if (h->cap.flags & V4L2_FLAG_STREAMING)
-       return v4l2_start_streaming(h,buffers);
-    return 0;
-}
-
-static void
-v4l2_stopvideo(void *handle)
-{
-    struct v4l2_handle *h = handle;
-
-    if (0 == h->fps)
-       fprintf(stderr,"v4l2_stopvideo: oops: fps==0\n");
-    h->fps = 0;
-
-    if (h->cap.flags & V4L2_FLAG_STREAMING)
-       v4l2_stop_streaming(h);
-}
-
-/* read images */
-static struct ng_video_buf*
-v4l2_nextframe(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    struct ng_video_buf *buf = NULL;
-    int rc,size,frame = 0;
-
-    if (h->cap.flags & V4L2_FLAG_STREAMING) {
-       v4l2_queue_all(h);
-       frame = v4l2_waiton(h);
-       if (-1 == frame)
-           return NULL;
-       h->buf_me[frame].refcount++;
-       buf = &h->buf_me[frame];
-       memset(&buf->info,0,sizeof(buf->info));
-       buf->info.ts = h->buf_v4l2[frame].timestamp;
-    } else {
-       size = h->fmt_me.bytesperline * h->fmt_me.height;
-       buf = ng_malloc_video_buf(&h->fmt_me,size);
-       rc = read(h->fd,buf->data,size);
-       if (rc != size) {
-           if (-1 == rc) {
-               perror("v4l2: read");
-           } else {
-               fprintf(stderr, "v4l2: read: rc=%d/size=%d\n",rc,size);
-           }
-           ng_release_video_buf(buf);
-           return NULL;
-       }
-       memset(&buf->info,0,sizeof(buf->info));
-       buf->info.ts = ng_get_timestamp();
-    }
-
-    if (h->first) {
-       h->first = 0;
-       h->start = buf->info.ts;
-       if (ng_debug)
-           fprintf(stderr,"v4l2: start ts=%lld\n",h->start);
-    }
-    buf->info.ts -= h->start;
-    return buf;
-}
-
-static struct ng_video_buf*
-v4l2_getimage(void *handle)
-{
-    struct v4l2_handle *h = handle;
-    struct ng_video_buf *buf; 
-    int size,frame,rc;
-
-    size = h->fmt_me.bytesperline * h->fmt_me.height;
-    buf = ng_malloc_video_buf(&h->fmt_me,size);
-    if (h->cap.flags & V4L2_FLAG_READ) {
-       rc = read(h->fd,buf->data,size);
-       if (rc != size) {
-           if (-1 == rc) {
-               perror("v4l2: read");
-           } else {
-               fprintf(stderr, "v4l2: read: rc=%d/size=%d\n",rc,size);
-           }
-           ng_release_video_buf(buf);
-           return NULL;
-       }
-    } else {
-       if (-1 == v4l2_start_streaming(h,1)) {
-           v4l2_stop_streaming(h);
-           return NULL;
-       }
-       frame = v4l2_waiton(h);
-       if (-1 == frame) {
-           v4l2_stop_streaming(h);
-           return NULL;
-       }
-       memcpy(buf->data,h->buf_me[0].data,size);
-       v4l2_stop_streaming(h);
-    }
-    return buf;
-}
-
-/* ---------------------------------------------------------------------- */
-
-extern void ng_plugin_init(void);
-void ng_plugin_init(void)
-{
-    ng_vid_driver_register(NG_PLUGIN_MAGIC,__FILE__,&v4l2_driver);
-}

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to