mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
gst/playback/gstdecodebin.c: Handle the case where a pad_block failed.
Original commit message from CVS: * gst/playback/gstdecodebin.c: (gst_decode_bin_init), (gst_decode_bin_dispose), (free_dynamics), (remove_fakesink), (pad_blocked), (close_pad_link), (new_pad), (no_more_pads): Handle the case where a pad_block failed.
This commit is contained in:
parent
1fd8c9981e
commit
6e48aa490c
2 changed files with 31 additions and 14 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2005-11-03 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/playback/gstdecodebin.c: (gst_decode_bin_init),
|
||||||
|
(gst_decode_bin_dispose), (free_dynamics), (remove_fakesink),
|
||||||
|
(pad_blocked), (close_pad_link), (new_pad), (no_more_pads):
|
||||||
|
Handle the case where a pad_block failed.
|
||||||
|
|
||||||
2005-11-02 Sebastien Cote <sebas642@yahoo.ca>
|
2005-11-02 Sebastien Cote <sebas642@yahoo.ca>
|
||||||
|
|
||||||
reviewed by: Zeeshan Ali <zeenix@gmail.com>
|
reviewed by: Zeeshan Ali <zeenix@gmail.com>
|
||||||
|
|
|
@ -480,15 +480,9 @@ mimetype_is_raw (const gchar * mimetype)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pad_unblocked (GstPad * pad, gboolean blocked, GstDecodeBin * decode_bin)
|
remove_fakesink (GstDecodeBin * decode_bin)
|
||||||
{
|
{
|
||||||
}
|
if (decode_bin->fakesink) {
|
||||||
|
|
||||||
static void
|
|
||||||
pad_blocked (GstPad * pad, gboolean blocked, GstDecodeBin * decode_bin)
|
|
||||||
{
|
|
||||||
decode_bin->numwaiting--;
|
|
||||||
if (decode_bin->numwaiting == 0 && decode_bin->fakesink) {
|
|
||||||
gst_object_ref (decode_bin->fakesink);
|
gst_object_ref (decode_bin->fakesink);
|
||||||
gst_bin_remove (GST_BIN (decode_bin), decode_bin->fakesink);
|
gst_bin_remove (GST_BIN (decode_bin), decode_bin->fakesink);
|
||||||
|
|
||||||
|
@ -502,8 +496,19 @@ pad_blocked (GstPad * pad, gboolean blocked, GstDecodeBin * decode_bin)
|
||||||
gst_element_post_message (GST_ELEMENT_CAST (decode_bin),
|
gst_element_post_message (GST_ELEMENT_CAST (decode_bin),
|
||||||
gst_message_new_state_dirty (GST_OBJECT_CAST (decode_bin)));
|
gst_message_new_state_dirty (GST_OBJECT_CAST (decode_bin)));
|
||||||
}
|
}
|
||||||
gst_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_unblocked,
|
}
|
||||||
NULL);
|
|
||||||
|
static void
|
||||||
|
pad_blocked (GstPad * pad, gboolean blocked, GstDecodeBin * decode_bin)
|
||||||
|
{
|
||||||
|
if (blocked) {
|
||||||
|
decode_bin->numwaiting--;
|
||||||
|
if (decode_bin->numwaiting == 0) {
|
||||||
|
remove_fakesink (decode_bin);
|
||||||
|
}
|
||||||
|
gst_pad_set_blocked_async (pad, FALSE, (GstPadBlockCallback) pad_blocked,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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
|
||||||
|
@ -559,14 +564,15 @@ close_pad_link (GstElement * element, GstPad * pad, GstCaps * caps,
|
||||||
/* 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++;
|
||||||
decode_bin->numwaiting++;
|
|
||||||
|
|
||||||
/* make it a ghostpad */
|
/* make it a ghostpad */
|
||||||
ghost = gst_ghost_pad_new (padname, pad);
|
ghost = gst_ghost_pad_new (padname, pad);
|
||||||
gst_element_add_pad (GST_ELEMENT (decode_bin), ghost);
|
gst_element_add_pad (GST_ELEMENT (decode_bin), ghost);
|
||||||
|
|
||||||
gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked,
|
if (gst_pad_set_blocked_async (pad, TRUE, (GstPadBlockCallback) pad_blocked,
|
||||||
decode_bin);
|
decode_bin)) {
|
||||||
|
decode_bin->numwaiting++;
|
||||||
|
}
|
||||||
|
|
||||||
GST_LOG_OBJECT (element, "closed pad %s", padname);
|
GST_LOG_OBJECT (element, "closed pad %s", padname);
|
||||||
|
|
||||||
|
@ -898,10 +904,14 @@ no_more_pads (GstElement * element, GstDynamic * dynamic)
|
||||||
/* if we have no more dynamic elements, we have no chance of creating
|
/* if we have no more dynamic elements, we have no chance of creating
|
||||||
* more pads, so we fire the no_more_pads signal */
|
* more pads, so we fire the no_more_pads signal */
|
||||||
if (decode_bin->dynamics == NULL) {
|
if (decode_bin->dynamics == NULL) {
|
||||||
|
if (decode_bin->numwaiting == 0) {
|
||||||
|
GST_DEBUG_OBJECT (decode_bin,
|
||||||
|
"no more dynamic elements, removing fakesink");
|
||||||
|
remove_fakesink (decode_bin);
|
||||||
|
}
|
||||||
GST_DEBUG_OBJECT (decode_bin,
|
GST_DEBUG_OBJECT (decode_bin,
|
||||||
"no more dynamic elements, signaling no_more_pads");
|
"no more dynamic elements, signaling no_more_pads");
|
||||||
gst_element_no_more_pads (GST_ELEMENT (decode_bin));
|
gst_element_no_more_pads (GST_ELEMENT (decode_bin));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (decode_bin, "we have more dynamic elements");
|
GST_DEBUG_OBJECT (decode_bin, "we have more dynamic elements");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue