summary refs log tree commit diff
path: root/pkgs/os-specific/linux/v4l2loopback
diff options
context:
space:
mode:
authorbetaboon <betaboon@0x80.ninja>2023-04-02 20:29:10 +0200
committerbetaboon <betaboon@0x80.ninja>2023-04-07 17:34:54 +0200
commitfc6c5c71b4c571aa0bef04b04f66780f1e88730f (patch)
tree6b76b8b57643e77a250d0a6fedf85d43375246c5 /pkgs/os-specific/linux/v4l2loopback
parente3802695c8d5f610b871a51d47330c40a2ec5676 (diff)
downloadnixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar.gz
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar.bz2
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar.lz
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar.xz
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.tar.zst
nixpkgs-fc6c5c71b4c571aa0bef04b04f66780f1e88730f.zip
v4l2loopback: unstable-2022-08-05 -> unstable-2023-02-19
Diffstat (limited to 'pkgs/os-specific/linux/v4l2loopback')
-rw-r--r--pkgs/os-specific/linux/v4l2loopback/default.nix11
-rw-r--r--pkgs/os-specific/linux/v4l2loopback/revert-pr518.patch55
2 files changed, 63 insertions, 3 deletions
diff --git a/pkgs/os-specific/linux/v4l2loopback/default.nix b/pkgs/os-specific/linux/v4l2loopback/default.nix
index 3bb1650e8c8..2c1b4fbb4f4 100644
--- a/pkgs/os-specific/linux/v4l2loopback/default.nix
+++ b/pkgs/os-specific/linux/v4l2loopback/default.nix
@@ -2,15 +2,20 @@
 
 stdenv.mkDerivation rec {
   pname = "v4l2loopback";
-  version = "unstable-2022-08-05-${kernel.version}";
+  version = "unstable-2023-02-19-${kernel.version}";
 
   src = fetchFromGitHub {
     owner = "umlaeute";
     repo = "v4l2loopback";
-    rev = "76434ab6f71d5ecbff8a218ff6bed91ea2bf73b8";
-    sha256 = "sha256-TdZacRkFAO2HAEbljzXeJ241VcDqSwBECq3bnn7yvBY=";
+    rev = "fb410fc7af40e972058809a191fae9517b9313af";
+    hash = "sha256-gLFtR7s+3LUQ0BZxHbmaArHbufuphbtAX99nxJU3c84=";
   };
 
+  patches = [
+    # fix bug https://github.com/umlaeute/v4l2loopback/issues/535
+    ./revert-pr518.patch
+  ];
+
   hardeningDisable = [ "format" "pic" ];
 
   preBuild = ''
diff --git a/pkgs/os-specific/linux/v4l2loopback/revert-pr518.patch b/pkgs/os-specific/linux/v4l2loopback/revert-pr518.patch
new file mode 100644
index 00000000000..d5d2564c32c
--- /dev/null
+++ b/pkgs/os-specific/linux/v4l2loopback/revert-pr518.patch
@@ -0,0 +1,55 @@
+diff --git a/v4l2loopback.c b/v4l2loopback.c
+index 2ab1f76..2514f09 100644
+--- a/v4l2loopback.c
++++ b/v4l2loopback.c
+@@ -92,17 +92,6 @@ MODULE_LICENSE("GPL");
+ 		}                                                      \
+ 	} while (0)
+ 
+-/* TODO: Make sure that function is never interrupted. */
+-static inline int mod_inc(int *number, int mod)
+-{
+-	int result;
+-	result = (*number + 1) % mod;
+-	if (unlikely(result < 0))
+-		result += mod;
+-	*number = result;
+-	return result;
+-}
+-
+ static inline void v4l2l_get_timestamp(struct v4l2_buffer *b)
+ {
+ 	/* ktime_get_ts is considered deprecated, so use ktime_get_ts64 if possible */
+@@ -1424,8 +1413,9 @@ static int vidioc_reqbufs(struct file *file, void *fh,
+ 			i = dev->write_position;
+ 			list_for_each_entry(pos, &dev->outbufs_list,
+ 					    list_head) {
+-				dev->bufpos2index[mod_inc(&i, b->count)] =
++				dev->bufpos2index[i % b->count] =
+ 					pos->buffer.index;
++				++i;
+ 			}
+ 		}
+ 
+@@ -1489,9 +1479,10 @@ static void buffer_written(struct v4l2_loopback_device *dev,
+ 	del_timer_sync(&dev->timeout_timer);
+ 	spin_lock_bh(&dev->lock);
+ 
+-	dev->bufpos2index[mod_inc(&dev->write_position, dev->used_buffers)] =
++	dev->bufpos2index[dev->write_position % dev->used_buffers] =
+ 		buf->buffer.index;
+ 	list_move_tail(&buf->list_head, &dev->outbufs_list);
++	++dev->write_position;
+ 	dev->reread_count = 0;
+ 
+ 	check_timers(dev);
+@@ -1586,7 +1577,8 @@ static int get_capture_buffer(struct file *file)
+ 		if (dev->write_position >
+ 		    opener->read_position + dev->used_buffers)
+ 			opener->read_position = dev->write_position - 1;
+-		pos = mod_inc(&opener->read_position, dev->used_buffers);
++		pos = opener->read_position % dev->used_buffers;
++		++opener->read_position;
+ 	}
+ 	timeout_happened = dev->timeout_happened;
+ 	dev->timeout_happened = 0;