gst/playback/gstdecodebin.c: Add a queue after a demuxer if the demuxer outputs raw data. This was done before only f...
Original commit message from CVS: Patch by: Evgeniy Stepanov <eugeni dot stepanov at gmail dot com> * gst/playback/gstdecodebin.c: (add_raw_queue), (close_pad_link): Add a queue after a demuxer if the demuxer outputs raw data. This was done before only for non-raw data but is required in this case too. Fixes bug #540215. decodebin2 doesn't have this issue because all streams of a group go through multiqueue.
This commit is contained in:
parent
c3e1de9033
commit
bddd224b36
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2008-07-07 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
|
Patch by: Evgeniy Stepanov <eugeni dot stepanov at gmail dot com>
|
||||||
|
|
||||||
|
* gst/playback/gstdecodebin.c: (add_raw_queue), (close_pad_link):
|
||||||
|
Add a queue after a demuxer if the demuxer outputs raw data. This was
|
||||||
|
done before only for non-raw data but is required in this case too.
|
||||||
|
Fixes bug #540215.
|
||||||
|
|
||||||
|
decodebin2 doesn't have this issue because all streams of a group
|
||||||
|
go through multiqueue.
|
||||||
|
|
||||||
2008-07-03 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-07-03 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
|
Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
|
||||||
|
@ -160,6 +160,8 @@ static void new_caps (GstPad * pad, GParamSpec * unused, GstDynamic * dynamic);
|
|||||||
static void queue_filled_cb (GstElement * queue, GstDecodeBin * decode_bin);
|
static void queue_filled_cb (GstElement * queue, GstDecodeBin * decode_bin);
|
||||||
static void queue_underrun_cb (GstElement * queue, GstDecodeBin * decode_bin);
|
static void queue_underrun_cb (GstElement * queue, GstDecodeBin * decode_bin);
|
||||||
|
|
||||||
|
static gboolean is_demuxer_element (GstElement * srcelement);
|
||||||
|
|
||||||
static GstElementClass *parent_class;
|
static GstElementClass *parent_class;
|
||||||
static guint gst_decode_bin_signals[LAST_SIGNAL] = { 0 };
|
static guint gst_decode_bin_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
@ -719,6 +721,45 @@ pad_probe (GstPad * pad, GstMiniObject * data, GstDecodeBin * decode_bin)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: this should be somehow merged with the queue code in
|
||||||
|
* try_to_link_1() to reduce code duplication */
|
||||||
|
static GstPad *
|
||||||
|
add_raw_queue (GstDecodeBin * decode_bin, GstPad * pad)
|
||||||
|
{
|
||||||
|
GstElement *queue = NULL;
|
||||||
|
GstPad *queuesinkpad = NULL, *queuesrcpad = NULL;
|
||||||
|
|
||||||
|
queue = gst_element_factory_make ("queue", NULL);
|
||||||
|
decode_bin->queue_type = G_OBJECT_TYPE (queue);
|
||||||
|
|
||||||
|
g_object_set (G_OBJECT (queue), "max-size-buffers", 0, NULL);
|
||||||
|
g_object_set (G_OBJECT (queue), "max-size-time", G_GINT64_CONSTANT (0), NULL);
|
||||||
|
g_object_set (G_OBJECT (queue), "max-size-bytes", 8192, NULL);
|
||||||
|
gst_bin_add (GST_BIN (decode_bin), queue);
|
||||||
|
gst_element_set_state (queue, GST_STATE_READY);
|
||||||
|
queuesinkpad = gst_element_get_static_pad (queue, "sink");
|
||||||
|
queuesrcpad = gst_element_get_static_pad (queue, "src");
|
||||||
|
|
||||||
|
if (gst_pad_link (pad, queuesinkpad) != GST_PAD_LINK_OK) {
|
||||||
|
gst_element_set_state (queue, GST_STATE_NULL);
|
||||||
|
gst_object_unref (queuesrcpad);
|
||||||
|
gst_object_unref (queuesinkpad);
|
||||||
|
gst_bin_remove (GST_BIN (decode_bin), queue);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
decode_bin->queues = g_list_append (decode_bin->queues, queue);
|
||||||
|
g_signal_connect (G_OBJECT (queue),
|
||||||
|
"overrun", G_CALLBACK (queue_filled_cb), decode_bin);
|
||||||
|
g_signal_connect (G_OBJECT (queue),
|
||||||
|
"underrun", G_CALLBACK (queue_underrun_cb), decode_bin);
|
||||||
|
|
||||||
|
gst_element_set_state (queue, GST_STATE_PAUSED);
|
||||||
|
gst_object_unref (queuesinkpad);
|
||||||
|
|
||||||
|
return queuesrcpad;
|
||||||
|
}
|
||||||
|
|
||||||
/* given a pad and a caps from an element, find the list of elements
|
/* given a pad and a caps from an element, find the list of elements
|
||||||
* that could connect to the pad
|
* that could connect to the pad
|
||||||
*
|
*
|
||||||
@ -771,6 +812,17 @@ close_pad_link (GstElement * element, GstPad * pad, GstCaps * caps,
|
|||||||
GstPad *ghost;
|
GstPad *ghost;
|
||||||
PadProbeData *data;
|
PadProbeData *data;
|
||||||
|
|
||||||
|
/* If we're at a demuxer element but have raw data already
|
||||||
|
* we have to add a queue here. For non-raw data this is done
|
||||||
|
* in try_to_link_1() */
|
||||||
|
if (is_demuxer_element (element)) {
|
||||||
|
GST_DEBUG_OBJECT (decode_bin,
|
||||||
|
"Element %s is a demuxer, inserting a queue",
|
||||||
|
GST_OBJECT_NAME (element));
|
||||||
|
|
||||||
|
pad = add_raw_queue (decode_bin, pad);
|
||||||
|
}
|
||||||
|
|
||||||
/* make a unique name for this new pad */
|
/* make a unique name for this new pad */
|
||||||
padname = g_strdup_printf ("src%d", decode_bin->numpads);
|
padname = g_strdup_printf ("src%d", decode_bin->numpads);
|
||||||
decode_bin->numpads++;
|
decode_bin->numpads++;
|
||||||
@ -800,6 +852,11 @@ close_pad_link (GstElement * element, GstPad * pad, GstCaps * caps,
|
|||||||
GST_DEBUG_OBJECT (decode_bin, "emitted new-decoded-pad");
|
GST_DEBUG_OBJECT (decode_bin, "emitted new-decoded-pad");
|
||||||
|
|
||||||
g_free (padname);
|
g_free (padname);
|
||||||
|
|
||||||
|
/* If we're at a demuxer element pad was set to a queue's
|
||||||
|
* srcpad and must be unref'd here */
|
||||||
|
if (is_demuxer_element (element))
|
||||||
|
gst_object_unref (pad);
|
||||||
} else {
|
} else {
|
||||||
GList *to_try;
|
GList *to_try;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user