static void demux_no_more_pads (GstElement * element, RsnDvdBin * dvdbin) { gboolean no_more_pads = FALSE; guint n_audio_pads = 0; DVDBIN_PREROLL_LOCK (dvdbin); g_object_get (dvdbin->pieces[DVD_ELEM_AUD_SELECT], "n-pads", &n_audio_pads, NULL); if (n_audio_pads == 0) { no_more_pads = dvdbin->video_added && dvdbin->subpicture_added; dvdbin->audio_broken = TRUE; } DVDBIN_PREROLL_UNLOCK (dvdbin); if (no_more_pads) { GST_DEBUG_OBJECT (dvdbin, "Firing no more pads from demuxer no-more-pads cb"); gst_element_no_more_pads (GST_ELEMENT (dvdbin)); } }
static void dvdbin_pad_blocked_cb (GstPad * opad, gboolean blocked, RsnDvdBinPadBlockCtx * ctx) { RsnDvdBin *dvdbin; GstPad *pad; gboolean added_last_pad = FALSE; gboolean added = FALSE; /* If not blocked ctx is NULL! */ if (!blocked) { GST_DEBUG_OBJECT (opad, "Pad unblocked"); return; } dvdbin = ctx->dvdbin; pad = ctx->pad; if (pad == dvdbin->subpicture_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> subpicture pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->subpicture_added; dvdbin->subpicture_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->subpicture_pad); added_last_pad = ((dvdbin->audio_broken || dvdbin->audio_added) && dvdbin->video_added); } DVDBIN_PREROLL_UNLOCK (dvdbin); gst_pad_set_blocked_async (opad, FALSE, (GstPadBlockCallback) dvdbin_pad_blocked_cb, NULL); } else if (pad == dvdbin->audio_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> audio pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->audio_added; dvdbin->audio_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->audio_pad); added_last_pad = (dvdbin->subpicture_added && dvdbin->video_added); } DVDBIN_PREROLL_UNLOCK (dvdbin); gst_pad_set_blocked_async (opad, FALSE, (GstPadBlockCallback) dvdbin_pad_blocked_cb, NULL); } else if (pad == dvdbin->video_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> video pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->video_added; dvdbin->video_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->video_pad); added_last_pad = (dvdbin->subpicture_added && (dvdbin->audio_added || dvdbin->audio_broken)); } DVDBIN_PREROLL_UNLOCK (dvdbin); gst_pad_set_blocked_async (opad, FALSE, (GstPadBlockCallback) dvdbin_pad_blocked_cb, NULL); } if (added_last_pad) { GST_DEBUG_OBJECT (dvdbin, "Firing no more pads from pad-blocked cb"); gst_element_no_more_pads (GST_ELEMENT (dvdbin)); } }
static GstPadProbeReturn dvdbin_pad_blocked_cb (GstPad * opad, GstPadProbeInfo * info, RsnDvdBinPadBlockCtx * ctx) { RsnDvdBin *dvdbin; GstPad *pad; gboolean added_last_pad = FALSE; gboolean added = FALSE; guint pad_block_id = 0; dvdbin = ctx->dvdbin; pad = ctx->pad; if (pad == dvdbin->subpicture_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> subpicture pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->subpicture_added; dvdbin->subpicture_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->subpicture_pad); added_last_pad = ((dvdbin->audio_broken || dvdbin->audio_added) && dvdbin->video_added); } pad_block_id = ctx->pad_block_id; ctx->pad_block_id = 0; DVDBIN_PREROLL_UNLOCK (dvdbin); if (pad_block_id) gst_pad_remove_probe (opad, pad_block_id); } else if (pad == dvdbin->audio_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> audio pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->audio_added; dvdbin->audio_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->audio_pad); added_last_pad = (dvdbin->subpicture_added && dvdbin->video_added); } pad_block_id = ctx->pad_block_id; ctx->pad_block_id = 0; DVDBIN_PREROLL_UNLOCK (dvdbin); if (pad_block_id) gst_pad_remove_probe (opad, pad_block_id); } else if (pad == dvdbin->video_pad) { GST_DEBUG_OBJECT (opad, "Pad block -> video pad"); DVDBIN_PREROLL_LOCK (dvdbin); added = dvdbin->video_added; dvdbin->video_added = TRUE; if (!added) { gst_element_add_pad (GST_ELEMENT (dvdbin), dvdbin->video_pad); added_last_pad = (dvdbin->subpicture_added && (dvdbin->audio_added || dvdbin->audio_broken)); } pad_block_id = ctx->pad_block_id; ctx->pad_block_id = 0; DVDBIN_PREROLL_UNLOCK (dvdbin); if (pad_block_id) gst_pad_remove_probe (opad, pad_block_id); } if (added_last_pad) { GST_DEBUG_OBJECT (dvdbin, "Firing no more pads from pad-blocked cb"); rsn_dvdbin_no_more_pads (dvdbin); } return GST_PAD_PROBE_OK; }