Make device_open() store the VIDIOC_QUERYCAP ioctl errno, and in case
of failure return the stored value rather than the current errno, which may be overwritten by a following call to close(). Originally committed as revision 23001 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
2d23fecd5d
commit
50f852186f
@ -153,7 +153,7 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
|
|||||||
{
|
{
|
||||||
struct v4l2_capability cap;
|
struct v4l2_capability cap;
|
||||||
int fd;
|
int fd;
|
||||||
int res;
|
int res, err;
|
||||||
int flags = O_RDWR;
|
int flags = O_RDWR;
|
||||||
|
|
||||||
if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
|
if (ctx->flags & AVFMT_FLAG_NONBLOCK) {
|
||||||
@ -169,18 +169,18 @@ static int device_open(AVFormatContext *ctx, uint32_t *capabilities)
|
|||||||
|
|
||||||
res = ioctl(fd, VIDIOC_QUERYCAP, &cap);
|
res = ioctl(fd, VIDIOC_QUERYCAP, &cap);
|
||||||
// ENOIOCTLCMD definition only availble on __KERNEL__
|
// ENOIOCTLCMD definition only availble on __KERNEL__
|
||||||
if (res < 0 && errno == 515) {
|
if (res < 0 && ((err = errno) == 515)) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "QUERYCAP not implemented, probably V4L device but not supporting V4L2\n");
|
av_log(ctx, AV_LOG_ERROR, "QUERYCAP not implemented, probably V4L device but not supporting V4L2\n");
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return AVERROR(errno);
|
return AVERROR(515);
|
||||||
}
|
}
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
|
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return AVERROR(errno);
|
return AVERROR(err);
|
||||||
}
|
}
|
||||||
if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
|
if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Not a video capture device\n");
|
av_log(ctx, AV_LOG_ERROR, "Not a video capture device\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user