} \
} G_STMT_END
+#define SET_PERCENT(q, perc) G_STMT_START { \
+ if (perc != q->buffering_percent) { \
+ q->buffering_percent = perc; \
+ q->percent_changed = TRUE; \
+ GST_DEBUG_OBJECT (q, "buffering %d percent", perc); \
+ get_buffering_stats (q, perc, &q->mode, &q->avg_in, &q->avg_out, \
+ &q->buffering_left); \
+ } \
+} G_STMT_END
+
#define _do_init \
GST_DEBUG_CATEGORY_INIT (queue_debug, "queue2", 0, "queue element"); \
GST_DEBUG_CATEGORY_INIT (queue_dataflow, "queue2_dataflow", 0, \
static void update_cur_level (GstQueue2 * queue, GstQueue2Range * range);
static void update_in_rates (GstQueue2 * queue);
+static void gst_queue2_post_buffering (GstQueue2 * queue);
typedef enum
{
g_cond_init (&queue->query_handled);
queue->last_query = FALSE;
+ g_mutex_init (&queue->buffering_post_lock);
queue->buffering_percent = 100;
/* tempfile related */
queue->last_query = FALSE;
g_queue_clear (&queue->queue);
g_mutex_clear (&queue->qlock);
+ g_mutex_clear (&queue->buffering_post_lock);
g_cond_clear (&queue->item_add);
g_cond_clear (&queue->item_del);
g_cond_clear (&queue->query_handled);
}
static void
+gst_queue2_post_buffering (GstQueue2 * queue)
+{
+ GstMessage *msg = NULL;
+
+ g_mutex_lock (&queue->buffering_post_lock);
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ if (queue->percent_changed) {
+ gint percent = queue->buffering_percent;
+
+ queue->percent_changed = FALSE;
+
+ GST_DEBUG_OBJECT (queue, "Going to post buffering: %d%%", percent);
+ msg = gst_message_new_buffering (GST_OBJECT_CAST (queue), percent);
+
+ gst_message_set_buffering_stats (msg, queue->mode, queue->avg_in,
+ queue->avg_out, queue->buffering_left);
+ }
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ if (msg != NULL)
+ gst_element_post_message (GST_ELEMENT_CAST (queue), msg);
+
+ g_mutex_unlock (&queue->buffering_post_lock);
+}
+
+static void
update_buffering (GstQueue2 * queue)
{
gint percent;
- gboolean post = FALSE;
/* Ensure the variables used to calculate buffering state are up-to-date. */
if (queue->current)
return;
if (queue->is_buffering) {
- post = TRUE;
/* if we were buffering see if we reached the high watermark */
if (percent >= queue->high_percent)
queue->is_buffering = FALSE;
+
+ SET_PERCENT (queue, percent);
} else {
/* we were not buffering, check if we need to start buffering if we drop
* below the low threshold */
if (percent < queue->low_percent) {
queue->is_buffering = TRUE;
- post = TRUE;
+ SET_PERCENT (queue, percent);
}
}
-
- if (post) {
- if (percent == queue->buffering_percent)
- post = FALSE;
- else
- queue->buffering_percent = percent;
- }
-
- if (post) {
- GstMessage *message;
- GstBufferingMode mode;
- gint avg_in, avg_out;
- gint64 buffering_left;
-
- get_buffering_stats (queue, percent, &mode, &avg_in, &avg_out,
- &buffering_left);
-
- message = gst_message_new_buffering (GST_OBJECT_CAST (queue),
- (gint) percent);
- gst_message_set_buffering_stats (message, mode,
- avg_in, avg_out, buffering_left);
-
- gst_element_post_message (GST_ELEMENT_CAST (queue), message);
- }
}
static void
goto out_eos;
gst_queue2_locked_enqueue (queue, event, GST_QUEUE2_ITEM_TYPE_EVENT);
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
} else {
/* non-serialized events are passed upstream. */
ret = gst_pad_push_event (queue->srcpad, event);
res = FALSE;
}
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
} else {
res = gst_pad_query_default (pad, parent, query);
}
/* put buffer in queue now */
gst_queue2_locked_enqueue (queue, item, item_type);
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
return GST_FLOW_OK;
item_type == GST_QUEUE2_ITEM_TYPE_BUFFER ||
item_type == GST_QUEUE2_ITEM_TYPE_BUFFER_LIST);
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
if (item_type == GST_QUEUE2_ITEM_TYPE_BUFFER) {
GstBuffer *buffer;
goto out_flushing;
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
return;
/* FIXME - function will block when the range is not yet available */
ret = gst_queue2_create_read (queue, offset, length, buffer);
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
return ret;
case PROP_USE_BUFFERING:
queue->use_buffering = g_value_get_boolean (value);
if (!queue->use_buffering && queue->is_buffering) {
- GstMessage *msg = gst_message_new_buffering (GST_OBJECT_CAST (queue),
- 100);
-
GST_DEBUG_OBJECT (queue, "Disabled buffering while buffering, "
"posting 100%% message");
+ SET_PERCENT (queue, 100);
queue->is_buffering = FALSE;
- gst_element_post_message (GST_ELEMENT_CAST (queue), msg);
}
if (queue->use_buffering) {
}
GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_queue2_post_buffering (queue);
}
static void