+2007-10-15 Wim Taymans <wim.taymans@gmail.com>
+
+ * gst/playback/gstqueue2.c: (gst_queue_init), (gst_queue_push_one):
+ Fix queue negotiation. See #486758.
+
2007-10-12 Jan Schmidt <Jan.Schmidt@sun.com>
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate),
static GstFlowReturn gst_queue_chain (GstPad * pad, GstBuffer * buffer);
static GstFlowReturn gst_queue_bufferalloc (GstPad * pad, guint64 offset,
guint size, GstCaps * caps, GstBuffer ** buf);
-static gboolean gst_queue_acceptcaps (GstPad * pad, GstCaps * caps);
static GstFlowReturn gst_queue_push_one (GstQueue * queue);
static void gst_queue_loop (GstPad * pad);
GST_DEBUG_FUNCPTR (gst_queue_get_range));
gst_pad_set_checkgetrange_function (queue->srcpad,
GST_DEBUG_FUNCPTR (gst_queue_src_checkgetrange_function));
- gst_pad_set_acceptcaps_function (queue->srcpad,
- GST_DEBUG_FUNCPTR (gst_queue_acceptcaps));
gst_pad_set_getcaps_function (queue->srcpad,
GST_DEBUG_FUNCPTR (gst_queue_getcaps));
gst_pad_set_event_function (queue->srcpad,
return result;
}
-static gboolean
-gst_queue_acceptcaps (GstPad * pad, GstCaps * caps)
-{
- /* The only time our acceptcaps method should be called is on the srcpad
- * when we push a buffer, in which case we always accepted those caps */
- return TRUE;
-}
-
/* calculate the diff between running time on the sink and src of the queue.
* This is the total amount of time in the queue. */
static void
next:
if (GST_IS_BUFFER (data)) {
- GstBuffer *buffer = GST_BUFFER_CAST (data);
+ GstBuffer *buffer;
+ GstCaps *caps;
+
+ buffer = GST_BUFFER_CAST (data);
+ caps = GST_BUFFER_CAPS (buffer);
GST_QUEUE_MUTEX_UNLOCK (queue);
+ /* set caps before pushing the buffer so that core does not try to do
+ * something fancy to check if this is possible. */
+ if (caps && caps != GST_PAD_CAPS (queue->srcpad))
+ gst_pad_set_caps (queue->srcpad, caps);
+
result = gst_pad_push (queue->srcpad, buffer);
/* need to check for srcresult here as well */