Merge commit '09f25533a564eab743f258d168697a11122914c4'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 10 Nov 2014 00:36:39 +0000 (01:36 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 10 Nov 2014 00:37:08 +0000 (01:37 +0100)
* commit '09f25533a564eab743f258d168697a11122914c4':
  v4l2: Preserve errno values

Conflicts:
libavdevice/v4l2.c

See: 60950adc18fe145a235211e75da68ab07123fcaa
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavdevice/v4l2.c

@@@ -105,57 -115,34 +105,57 @@@ struct buff_data 
  
  static int device_open(AVFormatContext *ctx)
  {
 +    struct video_data *s = ctx->priv_data;
      struct v4l2_capability cap;
      int fd;
-     int ret;
 -    int res, err;
++    int err;
      int flags = O_RDWR;
 -    char errbuf[128];
 +
 +#define SET_WRAPPERS(prefix) do {       \
 +    s->open_f   = prefix ## open;       \
 +    s->close_f  = prefix ## close;      \
 +    s->dup_f    = prefix ## dup;        \
 +    s->ioctl_f  = prefix ## ioctl;      \
 +    s->read_f   = prefix ## read;       \
 +    s->mmap_f   = prefix ## mmap;       \
 +    s->munmap_f = prefix ## munmap;     \
 +} while (0)
 +
 +    if (s->use_libv4l2) {
 +#if CONFIG_LIBV4L2
 +        SET_WRAPPERS(v4l2_);
 +#else
 +        av_log(ctx, AV_LOG_ERROR, "libavdevice is not build with libv4l2 support.\n");
 +        return AVERROR(EINVAL);
 +#endif
 +    } else {
 +        SET_WRAPPERS();
 +    }
 +
 +#define v4l2_open   s->open_f
 +#define v4l2_close  s->close_f
 +#define v4l2_dup    s->dup_f
 +#define v4l2_ioctl  s->ioctl_f
 +#define v4l2_read   s->read_f
 +#define v4l2_mmap   s->mmap_f
 +#define v4l2_munmap s->munmap_f
  
      if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
          flags |= O_NONBLOCK;
      }
  
 -    fd = avpriv_open(ctx->filename, flags);
 +    fd = v4l2_open(ctx->filename, flags, 0);
      if (fd < 0) {
-         ret = AVERROR(errno);
+         err = AVERROR(errno);
 -        av_strerror(err, errbuf, sizeof(errbuf));
 -
 -        av_log(ctx, AV_LOG_ERROR, "Cannot open video device %s : %s\n",
 -               ctx->filename, errbuf);
 -
 +        av_log(ctx, AV_LOG_ERROR, "Cannot open video device %s: %s\n",
-                ctx->filename, av_err2str(ret));
-         return ret;
++               ctx->filename, av_err2str(err));
+         return err;
      }
  
 -    res = ioctl(fd, VIDIOC_QUERYCAP, &cap);
 -    if (res < 0) {
 +    if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
-         ret = AVERROR(errno);
+         err = AVERROR(errno);
 -        av_strerror(err, errbuf, sizeof(errbuf));
          av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
-                av_err2str(ret));
 -               errbuf);
 -
++               av_err2str(err));
          goto fail;
      }
  
  
      if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
          av_log(ctx, AV_LOG_ERROR, "Not a video capture device.\n");
-         ret = AVERROR(ENODEV);
+         err = AVERROR(ENODEV);
 -
          goto fail;
      }
  
      if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
          av_log(ctx, AV_LOG_ERROR,
                 "The device does not support the streaming I/O method.\n");
-         ret = AVERROR(ENOSYS);
+         err = AVERROR(ENOSYS);
 -
          goto fail;
      }
  
      return fd;
  
  fail:
 -    close(fd);
 +    v4l2_close(fd);
-     return ret;
+     return err;
  }
  
  static int device_init(AVFormatContext *ctx, int *width, int *height,
@@@ -903,14 -796,18 +903,15 @@@ static int v4l2_read_header(AVFormatCon
      }
  
      if (!s->width && !s->height) {
 -        struct v4l2_format fmt;
 +        struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
  
 -        av_log(s1, AV_LOG_VERBOSE,
 +        av_log(ctx, AV_LOG_VERBOSE,
                 "Querying the device for the current frame size\n");
 -        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 -        if (ioctl(s->fd, VIDIOC_G_FMT, &fmt) < 0) {
 -            char errbuf[128];
 +        if (v4l2_ioctl(s->fd, VIDIOC_G_FMT, &fmt) < 0) {
              res = AVERROR(errno);
-             av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_FMT): %s\n", av_err2str(res));
 -            av_strerror(res, errbuf, sizeof(errbuf));
 -            av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_G_FMT): %s\n",
 -                   errbuf);
 -            return res;
++            av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_FMT): %s\n",
++                   av_err2str(res));
 +            goto fail;
          }
  
          s->width  = fmt.fmt.pix.width;