static GstPadLinkReturn gst_frame_store_link_src (GstPad *pad, GstPad *peer) { GstPadLinkReturn result = GST_PAD_LINK_OK; GstFrameStore *fs; fs = GST_FRAME_STORE(gst_pad_get_parent(pad)); if (GST_PAD_LINKFUNC (peer)) { result = GST_PAD_LINKFUNC(peer) (peer, pad); } if (GST_PAD_LINK_SUCCESSFUL (result)) { g_mutex_lock (fs->lock); fs->srcresult = GST_FLOW_OK; if (fs->srcresult == GST_FLOW_OK) { gst_pad_start_task (pad, (GstTaskFunction) gst_frame_store_task, pad); } else { GST_DEBUG("not starting task"); /* not starting task */ } g_mutex_unlock (fs->lock); } gst_object_unref (fs); return result; }
static GstPadLinkReturn gst_ghost_pad_do_link (GstPad * pad, GstPad * peer) { GstPadLinkReturn ret; GstPad *internal; GST_DEBUG_OBJECT (pad, "linking ghostpad"); internal = GST_PROXY_PAD_INTERNAL (pad); if (!gst_proxy_pad_set_target (internal, peer)) goto target_failed; ret = GST_PAD_LINK_OK; /* if we are a source pad, we should call the peer link function * if the peer has one, see design docs. */ if (GST_PAD_IS_SRC (pad)) { if (GST_PAD_LINKFUNC (peer)) { ret = GST_PAD_LINKFUNC (peer) (peer, pad); if (ret != GST_PAD_LINK_OK) goto link_failed; } } return ret; /* ERRORS */ target_failed: { GST_DEBUG_OBJECT (pad, "setting target failed"); return GST_PAD_LINK_REFUSED; } link_failed: { GST_DEBUG_OBJECT (pad, "linking failed"); /* clear target again */ gst_proxy_pad_set_target (internal, NULL); return ret; } }