g_mutex_unlock (&GST_URI_SOURCE_BIN_CAST(ubin)->buffering_lock); \
} G_STMT_END
-/* Track a source pad from a child that
- * is linked or needs linking to an output
- * slot, or source pads that are directly
- * exposed as ghost pads */
+/* Track a source pad from a child (source, typefind, demuxer) that is linked or
+ * needs linking to an output slot, or source pads that are directly exposed as
+ * ghost pads */
struct _ChildSrcPadInfo
{
- guint blocking_probe_id;
- guint event_probe_id;
-
- /* Source pad this info is attached to (not reffed, since
- * the pad owns the ChildSrcPadInfo as qdata */
+ /* Source pad this info is attached to (not reffed, since the pad owns the
+ * ChildSrcPadInfo as qdata) */
GstPad *src_pad;
- GstCaps *cur_caps; /* holds ref */
- GstPad *ghost_pad; /* ghostpad if any */
- /* Configured output slot, if any */
+ /* The output GhostPad if this info is for a directly exposed pad (raw or
+ * not), rather than linked through a slot. */
+ GstPad *output_pad;
+
+ /* Configured output slot, if any buffering/download is required */
OutputSlotInfo *output_slot;
- /* If this info is for a directly exposed pad,
- * rather than linked through a slot it's here: */
- GstPad *output_pad;
+ /* ADAPTIVE DEMUXER SPECIFIC */
+ guint blocking_probe_id;
+ guint event_probe_id;
+
+ /* Current caps of the adaptive demuxer source pad. Used to link new pending
+ * pads to a compatible (old) output slot.
+ *
+ * NOTE : This will eventually go away once only streams-aware elements are
+ * allowed within urisourcebin
+ */
+ GstCaps *cur_caps;
+
};
+/* Output Slot:
+ *
+ * Buffered output
+ */
struct _OutputSlotInfo
{
ChildSrcPadInfo *linked_info; /* demux source pad info feeding this slot, if any */
GstElement *queue; /* queue2 or downloadbuffer */
- GstPad *sinkpad; /* Sink pad of the queue eleemnt */
- GstPad *srcpad; /* Output ghost pad */
+ GstPad *queue_sinkpad; /* Sink pad of the queue eleemnt */
+ GstPad *output_pad; /* Output ghost pad */
gboolean is_eos; /* Did EOS get fed into the buffering element */
gulong bitrate_changed_id; /* queue bitrate changed notification */
/* If the demuxer handles buffering and is streams-aware, we can expose it
as-is directly. We still add an event probe to deal with EOS */
if (urisrc->demuxer_handles_buffering && urisrc->source_streams_aware) {
- info->ghost_pad = create_output_pad (urisrc, pad);
+ info->output_pad = gst_object_ref (create_output_pad (urisrc, pad));
GST_DEBUG_OBJECT (element,
"New streams-aware demuxer pad %s:%s , exposing directly",
GST_DEBUG_PAD_NAME (pad));
- expose_output_pad (urisrc, info->ghost_pad);
+ expose_output_pad (urisrc, info->output_pad);
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
} else {
GST_DEBUG_OBJECT (element, "new demuxer pad, name: <%s>. "
/* If the demuxer handles buffering, we can expose it as-is */
if (urisrc->demuxer_handles_buffering) {
- GstPad *ghostpad = create_output_pad (urisrc, pad);
+ g_assert (child_info->output_pad == NULL);
+ child_info->output_pad = gst_object_ref (create_output_pad (urisrc, pad));
GST_DEBUG_OBJECT (pad, "Demuxer handles buffering, exposing as-is");
- expose_output_pad (urisrc, ghostpad);
+ expose_output_pad (urisrc, child_info->output_pad);
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
goto done;
}
child_info->output_slot = slot;
slot->linked_info = child_info;
- gst_pad_link (pad, slot->sinkpad);
+ gst_pad_link (pad, slot->queue_sinkpad);
- output_pad = gst_object_ref (slot->srcpad);
+ output_pad = gst_object_ref (slot->output_pad);
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
GstCaps *cur_caps;
/* Look for a suitable pending pad */
- cur_caps = gst_pad_get_current_caps (slot->sinkpad);
+ cur_caps = gst_pad_get_current_caps (slot->queue_sinkpad);
GST_DEBUG_OBJECT (urisrc,
"Looking for a pending pad with caps %" GST_PTR_FORMAT, cur_caps);
if (out_info) {
/* Block any upstream stuff while we switch out the pad */
- guint block_id =
- gst_pad_add_probe (slot->sinkpad, GST_PAD_PROBE_TYPE_BLOCK_UPSTREAM,
+ guint block_id = gst_pad_add_probe (slot->queue_sinkpad,
+ GST_PAD_PROBE_TYPE_BLOCK_UPSTREAM,
NULL, NULL, NULL);
GST_DEBUG_OBJECT (urisrc, "Linking pending pad %" GST_PTR_FORMAT
" to existing output slot %p", out_info->src_pad, slot);
if (in_info) {
- gst_pad_unlink (in_info->src_pad, slot->sinkpad);
+ gst_pad_unlink (in_info->src_pad, slot->queue_sinkpad);
in_info->output_slot = NULL;
slot->linked_info = NULL;
}
- if (gst_pad_link (out_info->src_pad, slot->sinkpad) == GST_PAD_LINK_OK) {
+ if (gst_pad_link (out_info->src_pad,
+ slot->queue_sinkpad) == GST_PAD_LINK_OK) {
out_info->output_slot = slot;
slot->linked_info = out_info;
GST_ERROR_OBJECT (urisrc,
"Failed to link new demuxer pad to the output slot we tried");
}
- gst_pad_remove_probe (slot->sinkpad, block_id);
+ gst_pad_remove_probe (slot->queue_sinkpad, block_id);
}
return res;
for (cur = urisrc->out_slots; cur != NULL; cur = g_slist_next (cur)) {
slot = (OutputSlotInfo *) (cur->data);
if (slot->linked_info == NULL) {
- cur_caps = gst_pad_get_current_caps (slot->sinkpad);
+ cur_caps = gst_pad_get_current_caps (slot->queue_sinkpad);
if (cur_caps == NULL || gst_caps_is_equal (caps, cur_caps)) {
GST_LOG_OBJECT (urisrc, "Found existing slot %p to link to", slot);
gst_caps_unref (cur_caps);
gst_bin_add (GST_BIN_CAST (urisrc), queue);
gst_element_sync_state_with_parent (queue);
- slot->sinkpad = gst_element_get_static_pad (queue, "sink");
+ slot->queue_sinkpad = gst_element_get_static_pad (queue, "sink");
/* get the new raw srcpad */
srcpad = gst_element_get_static_pad (queue, "src");
g_object_set_data (G_OBJECT (srcpad), "urisourcebin.slotinfo", slot);
- slot->srcpad = create_output_pad (urisrc, srcpad);
+ slot->output_pad = create_output_pad (urisrc, srcpad);
gst_object_unref (srcpad);
seqnum = gst_event_get_seqnum (event);
eos = gst_event_new_eos ();
gst_event_set_seqnum (eos, seqnum);
- gst_pad_push_event (slot->srcpad, eos);
+ gst_pad_push_event (slot->output_pad, eos);
} else {
/* Do not clear output slot yet. A new input was
* connected. We should just drop this EOS */
seqnum = gst_event_get_seqnum (event);
eos = gst_event_new_eos ();
gst_event_set_seqnum (eos, seqnum);
- gst_pad_push_event (slot->srcpad, eos);
+ gst_pad_push_event (slot->output_pad, eos);
free_output_slot_async (urisrc, slot);
}
s = gst_event_writable_structure (event);
gst_structure_set (s, "urisourcebin-custom-eos", G_TYPE_BOOLEAN, TRUE,
NULL);
- gst_pad_send_event (slot->sinkpad, event);
+ gst_pad_send_event (slot->queue_sinkpad, event);
} else if (info->output_pad != NULL) {
GST_LOG_OBJECT (element,
"Pad %" GST_PTR_FORMAT " was removed. Unexposing %" GST_PTR_FORMAT,
pad, info->output_pad);
remove_output_pad (urisrc, info->output_pad);
} else {
- GST_LOG_OBJECT (urisrc, "Removed pad has no output slot or pad");
- if (urisrc->source_streams_aware) {
- GST_DEBUG_OBJECT (info->ghost_pad,
- "Streams-aware, removing pad immediately");
- gst_element_remove_pad ((GstElement *) urisrc, info->ghost_pad);
- }
+ GST_WARNING_OBJECT (urisrc, "Removed pad has no output slot or pad");
}
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
if (!slot)
goto no_slot;
- gst_pad_link (pad, slot->sinkpad);
+ gst_pad_link (pad, slot->queue_sinkpad);
/* get the new raw srcpad */
- output_pad = gst_object_ref (slot->srcpad);
+ output_pad = gst_object_ref (slot->output_pad);
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
GST_URI_SOURCE_BIN_LOCK (urisrc);
slot = get_output_slot (urisrc, do_download, FALSE, NULL);
- if (slot == NULL || gst_pad_link (srcpad, slot->sinkpad) != GST_PAD_LINK_OK)
+ if (slot == NULL
+ || gst_pad_link (srcpad, slot->queue_sinkpad) != GST_PAD_LINK_OK)
goto could_not_link;
gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
pre_queue_event_probe, urisrc, NULL);
- output_pad = gst_object_ref (slot->srcpad);
+ output_pad = gst_object_ref (slot->output_pad);
GST_URI_SOURCE_BIN_UNLOCK (urisrc);
expose_output_pad (urisrc, output_pad);
remove_buffering_msgs (urisrc, GST_OBJECT_CAST (slot->queue));
gst_bin_remove (GST_BIN_CAST (urisrc), slot->queue);
- gst_object_unref (slot->sinkpad);
+ gst_object_unref (slot->queue_sinkpad);
/* deactivate and remove the srcpad */
- gst_pad_set_active (slot->srcpad, FALSE);
- gst_element_remove_pad (GST_ELEMENT_CAST (urisrc), slot->srcpad);
+ gst_pad_set_active (slot->output_pad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT_CAST (urisrc), slot->output_pad);
g_free (slot);
}