queue: add burst/batch feature to reduce writer wakeups and context switches
Submitted by Venkat
Link to original bug (#613827)
Description
When I use max-size-buffers and min-threshold-buffers values as parameters to QUEUE in gstreamer pipe line, Its not waiting it is not waiting until it reach min-threshold-buffers. Currently queue fills the buffer as the buffer empty. It is not able to perform the requirement of waiting until it all buffers empty.
The changes needed found in gstqueue.c at gstreamer/plugins/elements/
function:gst_queue_chain (GstPad * pad, GstBuffer * buffer)
/* don't leak. Instead, wait for space to be available */
do {
/* for as long as the queue is filled, ait until min-threshold-buffers reaches. */
GST_QUEUE_WAIT_DEL_CHECK (queue, out_flushing);
} while (!gst_queue_is_empty(queue));
and
Need changes in gst_queue_is_empty function to satisfy all the conditions. I am not sure all the conditions (need some evaluation in this)
static gboolean gst_queue_is_empty (GstQueue * queue)
{
if (queue->queue->length == 0)
return TRUE;
if ((queue->cur_level.buffers == 0) || (queue->cur_level.bytes == 0) || (queue->cur_level.time == 0) )
return TRUE;
if (( queue->min_threshold.buffers == 0 &&
queue->cur_level.buffers < queue->
max_size.buffers) ||
(queue->min_threshold.bytes == 0 &&
queue->cur_level.bytes < queue->
max_size.bytes) ||
(queue->min_threshold.time == 0 &&
queue->cur_level.time < queue->
max_size.time)) &&
!gst_queue_is_filled (queue)
return TRUE;
/* It is possible that a max size is reached before all min thresholds are.
- Therefore, only consider it empty if it is not filled. */
return ((queue->min_threshold.buffers > 0 &&
queue->cur_level.buffers< queue->
min_threshold.buffers) ||
(queue->min_threshold.bytes > 0 &&
queue->cur_level.bytes< queue->
min_threshold.bytes) ||
(queue->min_threshold.time > 0 &&
queue->cur_level.time< queue->
min_threshold.time)) &&
!gst_queue_is_filled (queue);
}