mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-12 03:16:33 +00:00
IT WORKS\!\!\!
Original commit message from CVS: IT WORKS\!\!\!
This commit is contained in:
parent
d769aaaf99
commit
05a517acf1
1 changed files with 34 additions and 12 deletions
|
@ -55,6 +55,11 @@ struct _GstAutoplugger {
|
||||||
|
|
||||||
GstPad *sinkpadpeer, *srcpadpeer;
|
GstPad *sinkpadpeer, *srcpadpeer;
|
||||||
GstCaps *sinkcaps, *srccaps;
|
GstCaps *sinkcaps, *srccaps;
|
||||||
|
|
||||||
|
GstCaps *sinktemplatecaps;
|
||||||
|
|
||||||
|
GstAutoplug *autoplug;
|
||||||
|
GstElement *autobin;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstAutopluggerClass {
|
struct _GstAutopluggerClass {
|
||||||
|
@ -83,13 +88,12 @@ static void gst_autoplugger_get_arg (GtkObject *object, GtkArg *arg, guint id
|
||||||
|
|
||||||
static void gst_autoplugger_external_sink_caps_changed (GstPad *pad, GstCaps *caps, GstAutoplugger *autoplugger);
|
static void gst_autoplugger_external_sink_caps_changed (GstPad *pad, GstCaps *caps, GstAutoplugger *autoplugger);
|
||||||
static void gst_autoplugger_external_src_caps_changed (GstPad *pad, GstCaps *caps, GstAutoplugger *autoplugger);
|
static void gst_autoplugger_external_src_caps_changed (GstPad *pad, GstCaps *caps, GstAutoplugger *autoplugger);
|
||||||
|
|
||||||
static void gst_autoplugger_external_sink_connected (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
|
static void gst_autoplugger_external_sink_connected (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
|
||||||
static void gst_autoplugger_external_src_connected (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
|
static void gst_autoplugger_external_src_connected (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
|
||||||
|
|
||||||
static void gst_autoplugger_typefind_have_type (GstElement *element, GstCaps *caps, GstAutoplugger *autoplugger);
|
|
||||||
static void gst_autoplugger_cache_first_buffer (GstElement *element,GstBuffer *buf,GstAutoplugger *autoplugger);
|
static void gst_autoplugger_cache_first_buffer (GstElement *element,GstBuffer *buf,GstAutoplugger *autoplugger);
|
||||||
static void gst_autoplugger_cache_empty (GstElement *element, GstAutoplugger *autoplugger);
|
static void gst_autoplugger_cache_empty (GstElement *element, GstAutoplugger *autoplugger);
|
||||||
|
static void gst_autoplugger_typefind_have_type (GstElement *element, GstCaps *caps, GstAutoplugger *autoplugger);
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
//static guint gst_autoplugger_signals[LAST_SIGNAL] = { 0 };
|
//static guint gst_autoplugger_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
@ -203,7 +207,7 @@ gst_autoplugger_external_sink_connected(GstPad *pad, GstPad *peerpad, GstAutoplu
|
||||||
GstCaps *peercaps, *peertemplatecaps;
|
GstCaps *peercaps, *peertemplatecaps;
|
||||||
|
|
||||||
GST_INFO(GST_CAT_AUTOPLUG, "have cache:sink connected");
|
GST_INFO(GST_CAT_AUTOPLUG, "have cache:sink connected");
|
||||||
autoplugger->sinkpadpeer = peerpad;
|
// autoplugger->sinkpadpeer = peerpad;
|
||||||
|
|
||||||
if (autoplugger->sinkpadpeer) {
|
if (autoplugger->sinkpadpeer) {
|
||||||
peercaps = GST_PAD_CAPS(autoplugger->sinkpadpeer);
|
peercaps = GST_PAD_CAPS(autoplugger->sinkpadpeer);
|
||||||
|
@ -232,8 +236,8 @@ gst_autoplugger_external_src_connected(GstPad *pad, GstPad *peerpad, GstAutoplug
|
||||||
GST_INFO(GST_CAT_AUTOPLUG, "have cache:src connected");
|
GST_INFO(GST_CAT_AUTOPLUG, "have cache:src connected");
|
||||||
|
|
||||||
// only save this off if it isn't a pad we're using internally...
|
// only save this off if it isn't a pad we're using internally...
|
||||||
if (peerpad != autoplugger->typefind_sinkpad)
|
// if (peerpad != autoplugger->typefind_sinkpad)
|
||||||
autoplugger->srcpadpeer = peerpad;
|
// autoplugger->srcpadpeer = peerpad;
|
||||||
|
|
||||||
if (autoplugger->srcpadpeer) {
|
if (autoplugger->srcpadpeer) {
|
||||||
peercaps = GST_PAD_CAPS(autoplugger->srcpadpeer);
|
peercaps = GST_PAD_CAPS(autoplugger->srcpadpeer);
|
||||||
|
@ -246,6 +250,7 @@ gst_autoplugger_external_src_connected(GstPad *pad, GstPad *peerpad, GstAutoplug
|
||||||
if (peertemplatecaps) {
|
if (peertemplatecaps) {
|
||||||
GST_INFO(GST_CAT_AUTOPLUG, "there are some caps on this pad's peer's padtemplate %s",
|
GST_INFO(GST_CAT_AUTOPLUG, "there are some caps on this pad's peer's padtemplate %s",
|
||||||
gst_caps_get_mime(peertemplatecaps));
|
gst_caps_get_mime(peertemplatecaps));
|
||||||
|
autoplugger->sinktemplatecaps = peertemplatecaps;
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "turning on caps nego proxying in cache\n");
|
GST_DEBUG(GST_CAT_AUTOPLUG, "turning on caps nego proxying in cache\n");
|
||||||
gtk_object_set(GTK_OBJECT(autoplugger->cache),"caps_proxy",TRUE,NULL);
|
gtk_object_set(GTK_OBJECT(autoplugger->cache),"caps_proxy",TRUE,NULL);
|
||||||
}
|
}
|
||||||
|
@ -256,7 +261,7 @@ gst_autoplugger_external_src_connected(GstPad *pad, GstPad *peerpad, GstAutoplug
|
||||||
static void
|
static void
|
||||||
gst_autoplugger_cache_empty(GstElement *element, GstAutoplugger *autoplugger)
|
gst_autoplugger_cache_empty(GstElement *element, GstAutoplugger *autoplugger)
|
||||||
{
|
{
|
||||||
GstPad *cache_srcpad_peer;
|
GstPad *cache_sinkpad_peer,*cache_srcpad_peer;
|
||||||
|
|
||||||
GST_INFO(GST_CAT_AUTOPLUG, "autoplugger cache has hit empty, we can now remove it");
|
GST_INFO(GST_CAT_AUTOPLUG, "autoplugger cache has hit empty, we can now remove it");
|
||||||
|
|
||||||
|
@ -265,8 +270,9 @@ gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
|
||||||
|
|
||||||
// disconnect the cache from its peers
|
// disconnect the cache from its peers
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "disconnecting autoplugcache from its peers\n");
|
GST_DEBUG(GST_CAT_AUTOPLUG, "disconnecting autoplugcache from its peers\n");
|
||||||
gst_pad_disconnect(autoplugger->sinkpadpeer,autoplugger->cache_sinkpad);
|
cache_sinkpad_peer = GST_PAD (GST_PAD_PEER(autoplugger->cache_sinkpad));
|
||||||
cache_srcpad_peer = GST_PAD (GST_PAD_PEER(autoplugger->cache_srcpad));
|
cache_srcpad_peer = GST_PAD (GST_PAD_PEER(autoplugger->cache_srcpad));
|
||||||
|
gst_pad_disconnect(cache_sinkpad_peer,autoplugger->cache_sinkpad);
|
||||||
gst_pad_disconnect(autoplugger->cache_srcpad,cache_srcpad_peer);
|
gst_pad_disconnect(autoplugger->cache_srcpad,cache_srcpad_peer);
|
||||||
|
|
||||||
// remove the cache from self
|
// remove the cache from self
|
||||||
|
@ -275,11 +281,13 @@ gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
|
||||||
|
|
||||||
// connect the two pads
|
// connect the two pads
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "reconnecting the autoplugcache's former peers\n");
|
GST_DEBUG(GST_CAT_AUTOPLUG, "reconnecting the autoplugcache's former peers\n");
|
||||||
gst_pad_connect(autoplugger->sinkpadpeer,cache_srcpad_peer);
|
gst_pad_connect(cache_sinkpad_peer,cache_srcpad_peer);
|
||||||
|
|
||||||
// try to PLAY the whole thing
|
// try to PLAY the whole thing
|
||||||
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
|
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
|
||||||
|
|
||||||
|
xmlSaveFile("autoplugger.gst", gst_xml_write(GST_ELEMENT_SCHED(autoplugger)->parent));
|
||||||
|
|
||||||
GST_INFO(GST_CAT_AUTOPLUG, "autoplugger_cache_empty finished");
|
GST_INFO(GST_CAT_AUTOPLUG, "autoplugger_cache_empty finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,11 +307,24 @@ gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
|
||||||
gst_bin_remove(GST_BIN(autoplugger),autoplugger->typefind);
|
gst_bin_remove(GST_BIN(autoplugger),autoplugger->typefind);
|
||||||
|
|
||||||
// FIXME FIXME now we'd compare caps and see if we need to autoplug something in the middle, but for
|
// FIXME FIXME now we'd compare caps and see if we need to autoplug something in the middle, but for
|
||||||
// now we're going to just reconnect where we left off
|
// now we're going to just reconnect where we left off
|
||||||
|
// FIXME FIXME FIXME!!!: this should really be done in the caps failure!!!
|
||||||
|
if (!autoplugger->autoplug) {
|
||||||
|
autoplugger->autoplug = gst_autoplugfactory_make("static");
|
||||||
|
}
|
||||||
|
autoplugger->autobin = gst_autoplug_to_caps(autoplugger->autoplug,
|
||||||
|
caps,autoplugger->sinktemplatecaps,NULL);
|
||||||
|
g_return_if_fail(autoplugger->autobin != NULL);
|
||||||
|
gst_bin_add(GST_BIN(autoplugger),autoplugger->autobin);
|
||||||
|
|
||||||
// re-attach the srcpad's original peer to the cache
|
// // re-attach the srcpad's original peer to the cache
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "reconnecting the cache to the downstream peer\n");
|
// GST_DEBUG(GST_CAT_AUTOPLUG, "reconnecting the cache to the downstream peer\n");
|
||||||
gst_pad_connect(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
|
// gst_pad_connect(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
|
||||||
|
|
||||||
|
// attach the autoplugged bin
|
||||||
|
GST_DEBUG(GST_CAT_AUTOPLUG, "attaching the autoplugged bin between cache and downstream peer\n");
|
||||||
|
gst_pad_connect(autoplugger->cache_srcpad,gst_element_get_pad(autoplugger->autobin,"sink"));
|
||||||
|
gst_pad_connect(gst_element_get_pad(autoplugger->autobin,"src_00"),autoplugger->srcpadpeer);
|
||||||
|
|
||||||
// now reset the autoplugcache
|
// now reset the autoplugcache
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "resetting the cache to send first buffer(s) again\n");
|
GST_DEBUG(GST_CAT_AUTOPLUG, "resetting the cache to send first buffer(s) again\n");
|
||||||
|
@ -337,6 +358,7 @@ gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
|
||||||
|
|
||||||
// detach the srcpad
|
// detach the srcpad
|
||||||
GST_DEBUG(GST_CAT_AUTOPLUG, "disconnecting cache from its downstream peer\n");
|
GST_DEBUG(GST_CAT_AUTOPLUG, "disconnecting cache from its downstream peer\n");
|
||||||
|
autoplugger->srcpadpeer = GST_PAD(GST_PAD_PEER(autoplugger->cache_srcpad));
|
||||||
gst_pad_disconnect(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
|
gst_pad_disconnect(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
|
||||||
|
|
||||||
// instantiate the typefind and set up the signal handlers
|
// instantiate the typefind and set up the signal handlers
|
||||||
|
|
Loading…
Reference in a new issue