Giter Site home page Giter Site logo

Comments (2)

betaboon avatar betaboon commented on August 11, 2024

i just ran into the same issue.
running a git bisect between v0.12.7 and current HEAD also shows that the mentioned commit is the culprit.
i then tested with a revert-commit and the problem goes away.

this is the revert-patch:

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;

from v4l2loopback.

sanbrother avatar sanbrother commented on August 11, 2024

i just ran into the same issue. running a git bisect between v0.12.7 and current HEAD also shows that the mentioned commit is the culprit. i then tested with a revert-commit and the problem goes away.

It seems that, the base code depends heavily on read_position and write_position.
If modulo operation applied on the two variables, it is hard to judge if (write_position > read_position) is true.
So, as you see, my patch just increase the input number, but returns a modulo value. But it is strange to read the code.

from v4l2loopback.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.