mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
v4l2: increase by one the number of allocated buffers
Increasing this number fix a buffer starvation problem I'm hitting with a "v4l2src ! kmssink" pipeline. kmssink requests 2 buffer as it keeps a reference on the last rendered one. So we were allocating 3 buffers for the pipeline. Once the first 2 buffers have been pushed we ended up with: - one buffer queued in v4l2 - one being pushed - one kept as last rendered If this 3rd buffer is released after that v4l2 used the first one to capture we end up with a buffer starvation problem as no buffer is currently queued in v4l2 for capture. Fixing this by adding one extra buffer to the pipeline so when one buffer is being pushed downstream the other can already be queued to capture the next frame. We were already adding 3 buffers if downstream didn't reply to the allocation query. I reduced this number to 2 to compensate the extra buffer which is now always added. https://bugzilla.gnome.org/show_bug.cgi?id=783049
This commit is contained in:
parent
cd17c71dce
commit
47ca2ce499
1 changed files with 6 additions and 4 deletions
|
@ -4092,14 +4092,16 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
|
||||||
if (pushing_from_our_pool) {
|
if (pushing_from_our_pool) {
|
||||||
/* When pushing from our own pool, we need what downstream one, to be able
|
/* When pushing from our own pool, we need what downstream one, to be able
|
||||||
* to fill the pipeline, the minimum required to decoder according to the
|
* to fill the pipeline, the minimum required to decoder according to the
|
||||||
* driver and 1 more, so we don't endup up with everything downstream or
|
* driver and 2 more, so we don't endup up with everything downstream or
|
||||||
* held by the decoder. */
|
* held by the decoder. We account 2 buffers for v4l2 so when one is being
|
||||||
own_min = min + obj->min_buffers + 1;
|
* pushed downstream the other one can already be queued for the next
|
||||||
|
* frame. */
|
||||||
|
own_min = min + obj->min_buffers + 2;
|
||||||
|
|
||||||
/* If no allocation parameters where provided, allow for a little more
|
/* If no allocation parameters where provided, allow for a little more
|
||||||
* buffers and enable copy threshold */
|
* buffers and enable copy threshold */
|
||||||
if (!update) {
|
if (!update) {
|
||||||
own_min += 3;
|
own_min += 2;
|
||||||
gst_v4l2_buffer_pool_copy_at_threshold (GST_V4L2_BUFFER_POOL (pool),
|
gst_v4l2_buffer_pool_copy_at_threshold (GST_V4L2_BUFFER_POOL (pool),
|
||||||
TRUE);
|
TRUE);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue