Index: plugins/linux-v4l2/v4l2-input.c
--- plugins/linux-v4l2/v4l2-input.c.orig
+++ plugins/linux-v4l2/v4l2-input.c
@@ -26,8 +26,10 @@ along with this program.  If not, see <http://www.gnu.
 #include <sys/ioctl.h>
 #include <sys/select.h>
 
+#ifndef __OpenBSD__
 #include <linux/videodev2.h>
 #include <libv4l2.h>
+#endif
 
 #include <util/threading.h>
 #include <util/bmem.h>
@@ -149,7 +151,12 @@ static void v4l2_prep_obs_frame(struct v4l2_data *data
 		plane_offsets[2] = data->linesize * data->height * 5 / 4;
 		break;
 	default:
-		frame->linesize[0] = data->linesize;
+		/* Enforce fallback if driver returns invalid linesize */
+		if (data->linesize <= 0 || data->linesize > (data->width * 4)) {
+			frame->linesize[0] = data->width * 2; /* Standard UYVY 16bpp */
+		} else {
+			frame->linesize[0] = data->linesize;
+		}
 		break;
 	}
 }
@@ -178,7 +185,10 @@ static void *v4l2_thread(void *vptr)
 
 	/* Get framerate and calculate appropriate select timeout value. */
 	v4l2_unpack_tuple(&fps_num, &fps_denom, data->framerate);
-	ffps = (float)fps_denom / fps_num;
+        /* fall back to standard 30 FPS if the calculation yields an out-of-range value */
+	ffps = (fps_num > 0) ? ((float)fps_denom / fps_num) : 30.0f;
+	if (ffps <= 0.0f || ffps > 120.0f)
+		ffps = 30.0f;
 	blog(LOG_DEBUG, "%s: framerate: %.2f fps", data->device_id, ffps);
 	/* Timeout set to 5 frame periods. */
 	timeout_usec = (1000000 * data->timeout_frames) / ffps;
@@ -339,7 +349,7 @@ static void v4l2_device_list(obs_property_t *prop, obs
 	size_t cur_device_index;
 	const char *cur_device_name;
 
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
 	dirp = opendir("/dev");
 #else
 	dirp = opendir("/sys/class/video4linux");
@@ -359,7 +369,7 @@ static void v4l2_device_list(obs_property_t *prop, obs
 		uint32_t caps;
 		struct v4l2_capability video_cap;
 
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
 		if (strstr(dp->d_name, "video") == NULL)
 			continue;
 #endif
@@ -445,6 +455,7 @@ static void v4l2_input_list(int_fast32_t dev, obs_prop
 static void v4l2_format_list(int dev, obs_property_t *prop)
 {
 	struct v4l2_fmtdesc fmt;
+	memset(&fmt, 0, sizeof(fmt));
 	fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 	fmt.index = 0;
 	struct dstr buffer;
@@ -453,7 +464,17 @@ static void v4l2_format_list(int dev, obs_property_t *
 	obs_property_list_clear(prop);
 
 	while (v4l2_ioctl(dev, VIDIOC_ENUM_FMT, &fmt) == 0) {
+		/* Terminate string at first non-printable character or NUL */
+		fmt.description[sizeof(fmt.description) - 1] = '\0';
+		for (size_t i = 0; i < sizeof(fmt.description); i++) {
+			if (fmt.description[i] < 32 || fmt.description[i] > 126) {
+				fmt.description[i] = '\0';
+				break;
+			}
+		}
+
 		dstr_copy(&buffer, (char *)fmt.description);
+
 		if (fmt.flags & V4L2_FMT_FLAG_EMULATED)
 			dstr_cat(&buffer, " (Emulated)");
 
@@ -464,12 +485,16 @@ static void v4l2_format_list(int dev, obs_property_t *
 		} else {
 			blog(LOG_INFO, "Pixelformat: %s (unavailable)", buffer.array);
 		}
+
 		fmt.index++;
+		memset(&fmt.description, 0, sizeof(fmt.description));
 	}
 
 	dstr_free(&buffer);
 }
 
+
+
 /*
  * List video standards for the device
  */
@@ -587,7 +612,7 @@ static void v4l2_framerate_list(int dev, uint_fast32_t
 	case V4L2_FRMIVAL_TYPE_DISCRETE:
 		while (v4l2_ioctl(dev, VIDIOC_ENUM_FRAMEINTERVALS, &frmival) == 0) {
 			float fps = (float)frmival.discrete.denominator / frmival.discrete.numerator;
-			int pack = v4l2_pack_tuple(frmival.discrete.numerator, frmival.discrete.denominator);
+			int pack = (int)v4l2_pack_tuple(frmival.discrete.numerator, frmival.discrete.denominator);
 			dstr_printf(&buffer, "%.2f", fps);
 			obs_property_list_add_int(prop, buffer.array, pack);
 			frmival.index++;
@@ -685,7 +710,7 @@ static bool format_selected(obs_properties_t *props, o
 	obs_property_set_visible(dv_timing, (caps & V4L2_IN_CAP_DV_TIMINGS) ? true : false);
 
 	if (!caps) {
-		v4l2_resolution_list(dev, obs_data_get_int(settings, "pixelformat"), resolution);
+		v4l2_resolution_list(dev, (uint_fast32_t)obs_data_get_int(settings, "pixelformat"), resolution);
 	}
 	if (caps & V4L2_IN_CAP_STD)
 		v4l2_standard_list(dev, standard);
@@ -717,7 +742,7 @@ static bool resolution_selected(obs_properties_t *prop
 
 	obs_property_t *prop = obs_properties_get(props, "framerate");
 	v4l2_unpack_tuple(&width, &height, obs_data_get_int(settings, "resolution"));
-	v4l2_framerate_list(dev, obs_data_get_int(settings, "pixelformat"), width, height, prop);
+	v4l2_framerate_list(dev, (uint_fast32_t)obs_data_get_int(settings, "pixelformat"), width, height, prop);
 	v4l2_close(dev);
 
 	obs_property_modified(prop, settings);
@@ -1048,15 +1073,15 @@ static void v4l2_update(void *vptr, obs_data_t *settin
 		bfree(data->device_id);
 
 	data->device_id = bstrdup(obs_data_get_string(settings, "device_id"));
-	data->input = obs_data_get_int(settings, "input");
-	data->pixfmt = obs_data_get_int(settings, "pixelformat");
-	data->standard = obs_data_get_int(settings, "standard");
-	data->dv_timing = obs_data_get_int(settings, "dv_timing");
+	data->input = (int)obs_data_get_int(settings, "input");
+	data->pixfmt = (int)obs_data_get_int(settings, "pixelformat");
+	data->standard = (int)obs_data_get_int(settings, "standard");
+	data->dv_timing = (int)obs_data_get_int(settings, "dv_timing");
 	data->resolution = obs_data_get_int(settings, "resolution");
 	data->framerate = obs_data_get_int(settings, "framerate");
-	data->color_range = obs_data_get_int(settings, "color_range");
+	data->color_range = (int)obs_data_get_int(settings, "color_range");
 	data->auto_reset = obs_data_get_bool(settings, "auto_reset");
-	data->timeout_frames = obs_data_get_int(settings, "timeout_frames");
+	data->timeout_frames = (int)obs_data_get_int(settings, "timeout_frames");
 
 	v4l2_update_source_flags(data, settings);
 
