static int v4lv2_configure(V4lState *s) { struct v4l2_capability cap; if (ioctl (s->fd, VIDIOC_QUERYCAP, &cap)<0) { ms_message("Not a v4lv2 driver."); return -1; } if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { ms_error("%s is not a video capture device\n",s->dev); return -1; } if (!(cap.capabilities & V4L2_CAP_STREAMING)) { ms_error("%s does not support streaming i/o\n",s->dev); return -1; } if (v4lv2_try_format(s,V4L2_PIX_FMT_YUV420)){ s->pix_fmt=MS_YUV420P; s->int_pix_fmt=V4L2_PIX_FMT_YUV420; ms_message("v4lv2: YUV420P choosen"); }else if (v4lv2_try_format(s,V4L2_PIX_FMT_NV12)){ s->pix_fmt=MS_YUV420P; s->int_pix_fmt=V4L2_PIX_FMT_NV12; ms_message("v4lv2: V4L2_PIX_FMT_NV12 choosen"); }else if (v4lv2_try_format(s,V4L2_PIX_FMT_MJPEG)){ s->pix_fmt=MS_MJPEG; s->int_pix_fmt=V4L2_PIX_FMT_MJPEG; ms_message("v4lv2: MJPEG choosen"); }else if (v4lv2_try_format(s,V4L2_PIX_FMT_YUYV)){ s->pix_fmt=MS_YUYV; s->int_pix_fmt=V4L2_PIX_FMT_YUYV; ms_message("v4lv2: V4L2_PIX_FMT_YUYV choosen"); }else if (v4lv2_try_format(s,V4L2_PIX_FMT_RGB24)){ s->pix_fmt=MS_RGB24; s->int_pix_fmt=V4L2_PIX_FMT_RGB24; ms_message("v4lv2: RGB24 choosen"); }else{ ms_error("Could not find supported pixel format."); return -1; } return 0; }
static int msv4l2_configure(V4l2State *s){ struct v4l2_capability cap; struct v4l2_format fmt; MSVideoSize vsize; if (v4l2_ioctl (s->fd, VIDIOC_QUERYCAP, &cap)<0) { ms_message("Not a v4lv2 driver."); return -1; } if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { ms_error("%s is not a video capture device\n",s->dev); return -1; } if (!(cap.capabilities & V4L2_CAP_STREAMING)) { ms_error("%s does not support streaming i/o\n",s->dev); return -1; } ms_message("Driver is %s",cap.driver); memset(&fmt,0,sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (v4l2_ioctl (s->fd, VIDIOC_G_FMT, &fmt)<0){ ms_error("VIDIOC_G_FMT failed: %s",strerror(errno)); } vsize=s->vsize; do{ fmt.fmt.pix.width = s->vsize.width; fmt.fmt.pix.height = s->vsize.height; ms_message("v4l2: trying %ix%i",s->vsize.width,s->vsize.height); if (v4lv2_try_format(s,&fmt,V4L2_PIX_FMT_YUV420)){ s->pix_fmt=MS_YUV420P; s->int_pix_fmt=V4L2_PIX_FMT_YUV420; ms_message("v4lv2: YUV420P chosen"); break; }else if (v4lv2_try_format(s,&fmt,V4L2_PIX_FMT_YUYV)){ s->pix_fmt=MS_YUYV; s->int_pix_fmt=V4L2_PIX_FMT_YUYV; ms_message("v4lv2: V4L2_PIX_FMT_YUYV chosen"); break; }else if (v4lv2_try_format(s,&fmt,V4L2_PIX_FMT_RGB24)){ s->pix_fmt=MS_RGB24; s->int_pix_fmt=V4L2_PIX_FMT_RGB24; ms_message("v4lv2: RGB24 chosen"); break; }else if (v4lv2_try_format(s,&fmt,V4L2_PIX_FMT_MJPEG)){ s->pix_fmt=MS_MJPEG; s->int_pix_fmt=V4L2_PIX_FMT_MJPEG; ms_message("v4lv2: MJPEG chosen"); break; }else{ ms_error("Could not find supported pixel format for %ix%i", s->vsize.width, s->vsize.height); } s->vsize=ms_video_size_get_just_lower_than(s->vsize); }while(s->vsize.width!=0); if (s->vsize.width==0){ ms_message("Could not find any combination of resolution/pixel-format that works !"); s->vsize=vsize; return -1; } memset(&fmt,0,sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (v4l2_ioctl (s->fd, VIDIOC_G_FMT, &fmt)<0){ ms_error("VIDIOC_G_FMT failed: %s",strerror(errno)); }else{ ms_message("Size of webcam delivered pictures is %ix%i",fmt.fmt.pix.width,fmt.fmt.pix.height); s->vsize.width=fmt.fmt.pix.width; s->vsize.height=fmt.fmt.pix.height; } s->picture_size=get_picture_buffer_size(s->pix_fmt,s->vsize.width,s->vsize.height); s->configured=TRUE; return 0; }