Skip to content

Commit b3ee932

Browse files
committed
Fix closing of v4l2 device. Closes #1605
1 parent 2fda5d4 commit b3ee932

1 file changed

Lines changed: 16 additions & 21 deletions

File tree

src/video_v4l2.c

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,9 +1415,7 @@ static void v4l2_device_select(struct context *cnt, struct video_dev *curdev)
14151415

14161416
static int v4l2_device_open(struct context *cnt, struct video_dev *curdev)
14171417
{
1418-
14191418
int fd_device;
1420-
/* Open the video device */
14211419

14221420
MOTION_LOG(NTC, TYPE_VIDEO, NO_ERRNO
14231421
,_("Using videodevice %s and input %d")
@@ -1427,13 +1425,14 @@ static int v4l2_device_open(struct context *cnt, struct video_dev *curdev)
14271425
cnt->watchdog = (cnt->conf.watchdog_tmo * 2);
14281426

14291427
curdev->video_device = cnt->conf.video_device;
1428+
src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private;
14301429
curdev->fd_device = -1;
1430+
vid_source->fd_device = -1;
14311431
fd_device = -1;
14321432

14331433
fd_device = open(curdev->video_device, O_RDWR|O_CLOEXEC);
14341434
if (fd_device > 0) {
14351435
curdev->fd_device = fd_device;
1436-
src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private;
14371436
vid_source->fd_device = fd_device;
14381437
return 0;
14391438
}
@@ -1447,39 +1446,35 @@ static int v4l2_device_open(struct context *cnt, struct video_dev *curdev)
14471446

14481447
static void v4l2_device_close(struct video_dev *curdev)
14491448
{
1450-
14511449
src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private;
14521450
enum v4l2_buf_type type;
14531451

14541452
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1455-
14561453
if (vid_source != NULL) {
1457-
xioctl(vid_source, VIDIOC_STREAMOFF, &type);
1458-
}
1459-
1460-
if (vid_source->fd_device != -1) {
1461-
close(vid_source->fd_device);
1462-
vid_source->fd_device = -1;
1454+
if (vid_source->fd_device != -1) {
1455+
MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "close");
1456+
xioctl(vid_source, VIDIOC_STREAMOFF, &type);
1457+
close(vid_source->fd_device);
1458+
vid_source->fd_device = -1;
1459+
}
14631460
}
14641461
}
14651462

14661463
static void v4l2_device_cleanup(struct video_dev *curdev)
14671464
{
1468-
14691465
src_v4l2_t *vid_source = (src_v4l2_t *) curdev->v4l2_private;
1470-
14711466
unsigned int indx;
14721467
int indx2;
14731468

1474-
if (vid_source->buffers != NULL) {
1475-
for (indx = 0; indx < vid_source->req.count; indx++) {
1476-
munmap(vid_source->buffers[indx].ptr, vid_source->buffers[indx].size);
1477-
}
1478-
free(vid_source->buffers);
1479-
vid_source->buffers = NULL;
1480-
}
1481-
14821469
if (vid_source != NULL) {
1470+
MOTION_LOG(DBG, TYPE_VIDEO, NO_ERRNO, "vid_source");
1471+
if (vid_source->buffers != NULL) {
1472+
for (indx = 0; indx < vid_source->req.count; indx++) {
1473+
munmap(vid_source->buffers[indx].ptr, vid_source->buffers[indx].size);
1474+
}
1475+
free(vid_source->buffers);
1476+
vid_source->buffers = NULL;
1477+
}
14831478
free(vid_source);
14841479
curdev->v4l2_private = NULL;
14851480
}

0 commit comments

Comments
 (0)