fix: free video capture on early init error
This commit is contained in:
+38
-8
@@ -75,6 +75,7 @@ static void open_device(VideoCapture *video_capture, const char *name,
|
|||||||
strlcpy(video_capture->name, name, STR_LEN);
|
strlcpy(video_capture->name, name, STR_LEN);
|
||||||
video_capture->error = false;
|
video_capture->error = false;
|
||||||
video_capture->fd = -1;
|
video_capture->fd = -1;
|
||||||
|
video_capture->buf_count = 0;
|
||||||
|
|
||||||
video_capture->fd = open(name, O_RDWR | O_NONBLOCK);
|
video_capture->fd = open(name, O_RDWR | O_NONBLOCK);
|
||||||
if (video_capture->fd == -1) {
|
if (video_capture->fd == -1) {
|
||||||
@@ -214,6 +215,9 @@ static bool request_buffers(VideoCapture *video_capture,
|
|||||||
log_info("(%s) V4L2 Buffer Count: %d", video_capture->name, reqbuf.count);
|
log_info("(%s) V4L2 Buffer Count: %d", video_capture->name, reqbuf.count);
|
||||||
|
|
||||||
video_capture->buf_count = reqbuf.count;
|
video_capture->buf_count = reqbuf.count;
|
||||||
|
for (unsigned int i = 0; i < reqbuf.count; i++) {
|
||||||
|
video_capture->exp_fd[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -265,7 +269,7 @@ static bool open_stream(VideoCapture *video_capture) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_image_buffer(const VideoCapture *video_capture,
|
static bool create_image_buffer(VideoCapture *video_capture,
|
||||||
struct v4l2_buffer *buf, unsigned int index) {
|
struct v4l2_buffer *buf, unsigned int index) {
|
||||||
memset(buf, 0, sizeof(*buf));
|
memset(buf, 0, sizeof(*buf));
|
||||||
|
|
||||||
@@ -273,15 +277,24 @@ static void create_image_buffer(const VideoCapture *video_capture,
|
|||||||
buf->memory = V4L2_MEMORY_MMAP;
|
buf->memory = V4L2_MEMORY_MMAP;
|
||||||
buf->index = index;
|
buf->index = index;
|
||||||
|
|
||||||
ioctl(video_capture->fd, VIDIOC_QBUF, buf);
|
if (ioctl(video_capture->fd, VIDIOC_QBUF, buf) == -1) {
|
||||||
|
ioctl_error(video_capture, "VIDIOC_QBUF", "Could not enqueue buffer");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_image_buffers(VideoCapture *video_capture) {
|
static bool create_image_buffers(VideoCapture *video_capture) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < video_capture->buf_count; i++) {
|
for (i = 0; i < video_capture->buf_count; i++) {
|
||||||
create_image_buffer(video_capture, &video_capture->buf[i], i);
|
if (!create_image_buffer(video_capture, &video_capture->buf[i], i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_stream(const VideoCapture *video_capture) {
|
static void close_stream(const VideoCapture *video_capture) {
|
||||||
@@ -317,30 +330,46 @@ void video_init(VideoCapture *video_capture, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!check_caps(video_capture)) {
|
if (!check_caps(video_capture)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_available_sizes(video_capture, preferred_height)) {
|
if (!get_available_sizes(video_capture, preferred_height)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!set_format(video_capture)) {
|
if (!set_format(video_capture)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!request_buffers(video_capture, buffer_count)) {
|
if (!request_buffers(video_capture, buffer_count)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!export_buffers(video_capture)) {
|
if (!export_buffers(video_capture)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!open_stream(video_capture)) {
|
if (!open_stream(video_capture)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
create_image_buffers(video_capture);
|
if (!create_image_buffers(video_capture)) {
|
||||||
|
video_capture->error = true;
|
||||||
|
video_free(video_capture);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *video_background_read(void *args) {
|
void *video_background_read(void *args) {
|
||||||
@@ -388,13 +417,14 @@ void *video_background_read(void *args) {
|
|||||||
void video_free(const VideoCapture *video_capture) {
|
void video_free(const VideoCapture *video_capture) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
close_stream(video_capture);
|
|
||||||
|
|
||||||
for (i = 0; i < video_capture->buf_count; i++) {
|
for (i = 0; i < video_capture->buf_count; i++) {
|
||||||
close(video_capture->exp_fd[i]);
|
if (video_capture->exp_fd[i] != -1) {
|
||||||
|
close(video_capture->exp_fd[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (video_capture->fd != -1) {
|
if (video_capture->fd != -1) {
|
||||||
|
close_stream(video_capture);
|
||||||
close(video_capture->fd);
|
close(video_capture->fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user