GST_QUEUE2_ITEM_TYPE_QUERY
} GstQueue2ItemType;
+typedef struct
+{
+ GstQueue2ItemType type;
+ GstMiniObject *item;
+} GstQueue2Item;
+
/* static guint gst_queue2_signals[LAST_SIGNAL] = { 0 }; */
static void
GST_DEBUG_OBJECT (queue, "finalizing queue");
while (!g_queue_is_empty (&queue->queue)) {
- GstMiniObject *data = g_queue_pop_head (&queue->queue);
+ GstQueue2Item *qitem = g_queue_pop_head (&queue->queue);
- if (!GST_IS_QUERY (data))
- gst_mini_object_unref (data);
+ if (qitem->type != GST_QUEUE2_ITEM_TYPE_QUERY)
+ gst_mini_object_unref (qitem->item);
+ g_slice_free (GstQueue2Item, qitem);
}
queue->last_query = FALSE;
init_ranges (queue);
} else {
while (!g_queue_is_empty (&queue->queue)) {
- GstMiniObject *data = g_queue_pop_head (&queue->queue);
-
- if (!full && GST_IS_EVENT (data) && GST_EVENT_IS_STICKY (data) &&
- GST_EVENT_TYPE (data) != GST_EVENT_SEGMENT
- && GST_EVENT_TYPE (data) != GST_EVENT_EOS) {
- gst_pad_store_sticky_event (queue->srcpad, GST_EVENT_CAST (data));
+ GstQueue2Item *qitem = g_queue_pop_head (&queue->queue);
+
+ if (!full && qitem->type == GST_QUEUE2_ITEM_TYPE_EVENT
+ && GST_EVENT_IS_STICKY (qitem->item)
+ && GST_EVENT_TYPE (qitem->item) != GST_EVENT_SEGMENT
+ && GST_EVENT_TYPE (qitem->item) != GST_EVENT_EOS) {
+ gst_pad_store_sticky_event (queue->srcpad,
+ GST_EVENT_CAST (qitem->item));
}
/* Then lose another reference because we are supposed to destroy that
data when flushing */
- if (!GST_IS_QUERY (data))
- gst_mini_object_unref (data);
+ if (qitem->type != GST_QUEUE2_ITEM_TYPE_QUERY)
+ gst_mini_object_unref (qitem->item);
+ g_slice_free (GstQueue2Item, qitem);
}
}
g_cond_signal (&queue->query_handled);
update_buffering (queue);
if (QUEUE_IS_USING_QUEUE (queue)) {
- g_queue_push_tail (&queue->queue, item);
+ GstQueue2Item *qitem = g_slice_new (GstQueue2Item);
+ qitem->type = item_type;
+ qitem->item = item;
+ g_queue_push_tail (&queue->queue, qitem);
} else {
gst_mini_object_unref (GST_MINI_OBJECT_CAST (item));
}
{
GstMiniObject *item;
- if (!QUEUE_IS_USING_QUEUE (queue))
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
item = gst_queue2_read_item_from_file (queue);
- else
- item = g_queue_pop_head (&queue->queue);
+ } else {
+ GstQueue2Item *qitem = g_queue_pop_head (&queue->queue);
+ item = qitem->item;
+ g_slice_free (GstQueue2Item, qitem);
+ }
if (item == NULL)
goto no_item;
/* unblock the loop and chain functions */
GST_QUEUE2_SIGNAL_ADD (queue);
GST_QUEUE2_SIGNAL_DEL (queue);
+ queue->last_query = FALSE;
+ g_cond_signal (&queue->query_handled);
GST_QUEUE2_MUTEX_UNLOCK (queue);
/* make sure it pauses, this should happen since we sent
/* flush the sink pad */
queue->sinkresult = GST_FLOW_FLUSHING;
GST_QUEUE2_SIGNAL_DEL (queue);
+ queue->last_query = FALSE;
+ g_cond_signal (&queue->query_handled);
GST_QUEUE2_MUTEX_UNLOCK (queue);
gst_event_unref (event);