From 879f3b4f294584a550fbc4b20f69eeb13868d6e5 Mon Sep 17 00:00:00 2001 From: Erik Walthinsen Date: Tue, 1 May 2001 21:41:40 +0000 Subject: [PATCH] - fixed configure.in %VAR stuff Original commit message from CVS: - fixed configure.in %VAR stuff - fixed gstreamer.pc.in description string - fixed up incremental scheduling some more - updated the GST_DEBUG_FUNCPTR code to no longer need a hash - minor updates to DEBUG colorization - new test/mpeg2parse4.c --- configure.in | 6 +- gst/Makefile.am | 2 +- gst/gstbin.c | 29 +++-- gst/gstinfo.c | 30 ++++- gst/gstinfo.h | 17 +-- gst/gstqueue.c | 2 +- gst/gstscheduler.c | 86 ++++++++------ gst/gstscheduler.h | 11 +- gstreamer.pc.in | 2 +- plugins/elements/gstqueue.c | 2 +- test/.gitignore | 2 + test/Makefile.am | 2 +- test/mpeg2parse3.c | 2 - test/mpeg2parse4.c | 224 ++++++++++++++++++++++++++++++++++++ tests/mp1vid.c | 4 +- 15 files changed, 345 insertions(+), 76 deletions(-) create mode 100644 test/mpeg2parse4.c diff --git a/configure.in b/configure.in index 461c04e7e9..1a61ad04c0 100644 --- a/configure.in +++ b/configure.in @@ -730,9 +730,9 @@ AM_CONDITIONAL(HAVE_MPEG2DEC, test "x$HAVE_MPEG2DEC" = "xyes") AM_CONDITIONAL(HAVE_LIBXMMS, test "x$HAVE_LIBXMMS" = "xyes") AM_CONDITIONAL(HAVE_LIBRTP, test "x$HAVE_LIBRTP" = "xyes") AM_CONDITIONAL(HAVE_ARTS, test "x$HAVE_ARTS" = "xyes") -AM_CONDITIONAL(HAVE_RAW1394, test "x%HAVE_RAW1394" = "xyes") -AM_CONDITIONAL(HAVE_LIBDV, test "x%HAVE_LIBDV" = "xyes") -AM_CONDITIONAL(HAVE_LIBAA, test "x%HAVE_LIBAA" = "xyes") +AM_CONDITIONAL(HAVE_RAW1394, test "x$HAVE_RAW1394" = "xyes") +AM_CONDITIONAL(HAVE_LIBDV, test "x$HAVE_LIBDV" = "xyes") +AM_CONDITIONAL(HAVE_LIBAA, test "x$HAVE_LIBAA" = "xyes") diff --git a/gst/Makefile.am b/gst/Makefile.am index 1b4323c3f8..edd8c0df7f 100644 --- a/gst/Makefile.am +++ b/gst/Makefile.am @@ -129,7 +129,7 @@ noinst_HEADERS = \ gstsparc.h \ gstpropsprivate.h -CFLAGS = $(LIBGST_CFLAGS) +CFLAGS = $(LIBGST_CFLAGS) -D_GNU_SOURCE LIBS = $(LIBGST_LIBS) libgst_la_LDFLAGS = -version-info $(GST_LIBVERSION) diff --git a/gst/gstbin.c b/gst/gstbin.c index 4bbeb6e7c1..a5ef200719 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -174,7 +174,6 @@ gst_bin_reset_element_sched (GstElement *element, GstSchedule *sched) void gst_bin_set_element_sched (GstElement *element,GstSchedule *sched) { - GstSchedule *realsched = NULL; GList *children; GstElement *child; @@ -189,28 +188,25 @@ gst_bin_set_element_sched (GstElement *element,GstSchedule *sched) // if it's actually a Bin if (GST_IS_BIN(element)) { - // figure out which element is the manager if (GST_FLAG_IS_SET(element,GST_BIN_FLAG_MANAGER)) { - realsched = GST_ELEMENT_SCHED(element); - GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "setting children's schedule to own sched"); - } else { - realsched = sched; - GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "setting children's schedule to parent's"); - GST_SCHEDULE_ADD_ELEMENT (sched, element); + GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not resetting"); + return; } + GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "setting children's schedule to parent's"); + GST_SCHEDULE_ADD_ELEMENT (sched, element); + // set the children's schedule children = GST_BIN(element)->children; while (children) { child = GST_ELEMENT (children->data); children = g_list_next(children); - gst_bin_set_element_sched (child, realsched); + gst_bin_set_element_sched (child, sched); } // otherwise, if it's just a regular old element } else { -//g_print("calling schedule_add_element (%p, \"%s\")\n",sched, GST_ELEMENT_NAME(element)); GST_SCHEDULE_ADD_ELEMENT (sched, element); } } @@ -228,6 +224,15 @@ gst_bin_unset_element_sched (GstElement *element) // if it's actually a Bin if (GST_IS_BIN(element)) { + if (GST_FLAG_IS_SET(element,GST_BIN_FLAG_MANAGER)) { + GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not unsetting sched"); + return; + } + + // FIXME this check should be irrelevant + if (GST_ELEMENT_SCHED (element)) + GST_SCHEDULE_REMOVE_ELEMENT (GST_ELEMENT_SCHED(element), element); + // for each child, remove them from their schedule children = GST_BIN(element)->children; while (children) { @@ -239,6 +244,7 @@ gst_bin_unset_element_sched (GstElement *element) // otherwise, if it's just a regular old element } else { + // FIXME this check should be irrelevant if (GST_ELEMENT_SCHED (element)) GST_SCHEDULE_REMOVE_ELEMENT (GST_ELEMENT_SCHED(element), element); } @@ -262,7 +268,8 @@ gst_bin_add (GstBin *bin, g_return_if_fail (element != NULL); g_return_if_fail (GST_IS_ELEMENT (element)); - GST_DEBUG_ENTER (""); + GST_DEBUG (GST_CAT_PARENTAGE, "adding element \"%s\" to bin \"%s\"\n", + GST_ELEMENT_NAME(element),GST_ELEMENT_NAME(bin)); // must be not be in PLAYING state in order to modify bin // g_return_if_fail (GST_STATE (bin) != GST_STATE_PLAYING); diff --git a/gst/gstinfo.c b/gst/gstinfo.c index 2e3644203a..5d779a2dd5 100644 --- a/gst/gstinfo.c +++ b/gst/gstinfo.c @@ -20,6 +20,7 @@ * Boston, MA 02111-1307, USA. */ +#include #include "gst_private.h" #include "gstelement.h" #include "gstpad.h" @@ -50,7 +51,7 @@ static gchar *_gst_info_category_strings[] = { "STATES", "PLANNING", "SCHEDULING", - "OPERATION", + "DATAFLOW", "BUFFER", "CAPS", "CLOCK", @@ -85,7 +86,7 @@ const gchar *_gst_category_colors[32] = { [GST_CAT_AUTOPLUG_ATTEMPT] = "00;36;44", [GST_CAT_PARENTAGE] = "01;37;41", // !! [GST_CAT_STATES] = "00;31", - [GST_CAT_PLANNING] = "00;35", + [GST_CAT_PLANNING] = "07;35", [GST_CAT_SCHEDULING] = "00;35", [GST_CAT_DATAFLOW] = "00;32", [GST_CAT_BUFFER] = "00;32", @@ -153,12 +154,12 @@ gst_default_info_handler (gint category, gchar *file, gchar *function, #ifdef GST_DEBUG_ENABLED #ifdef GST_DEBUG_COLOR - fprintf(stderr,"INFO (\033[00;%dm%5d\033[00m:\033[00;%dm%2d\033[00m):\033[" + fprintf(stderr,"INFO (\033[00;%dm%5d\033[00m:\033[00;%dm%2d\033[00m)\033[" GST_DEBUG_CHAR_MODE ";%sm%s%s\033[00m %s\n", pthread_color,pthread_id,cothread_color,cothread_id, _gst_category_colors[category],location,elementname,string); #else - fprintf(stderr,"INFO (%5d:%2d):%s%s %s\n", + fprintf(stderr,"INFO (%5d:%2d)%s%s %s\n", getpid(),cothread_id,location,elementname,string); #endif /* GST_DEBUG_COLOR */ #else @@ -381,3 +382,24 @@ gst_default_error_handler (gchar *file, gchar *function, exit(1); } + + + +#ifdef __USE_GNU +#warning __USE_GNU is defined +#endif + +gchar * +_gst_debug_nameof_funcptr (void *ptr) +{ + gchar *ptrname; + Dl_info dlinfo; + if (__gst_function_pointers) { + if (ptrname = g_hash_table_lookup(__gst_function_pointers,ptr)) + return g_strdup(ptrname); + } else if (dladdr(ptr,&dlinfo)) { + return g_strdup(dlinfo.dli_sname); + } else { + return g_strdup_printf("%p",ptr); + } +} diff --git a/gst/gstinfo.h b/gst/gstinfo.h index 24bfc79775..5646d05ff0 100644 --- a/gst/gstinfo.h +++ b/gst/gstinfo.h @@ -76,16 +76,16 @@ G_GNUC_UNUSED static gchar *_debug_string = NULL; #ifdef _GST_COLOR_CODE #warning have a coded debug #define GST_DEBUG_PREFIX(cat,format,args...) \ -"DEBUG(%d:%d)\033[" _GST_COLOR_CODE "m" __PRETTY_FUNCTION__ ":%d\033[00m" format , \ +"DEBUG(%5d:%2d)\033[" _GST_COLOR_CODE "m" __PRETTY_FUNCTION__ ":%d\033[00m" format , \ getpid() , cothread_getcurrent() , __LINE__ , ## args #else #define GST_DEBUG_PREFIX(cat,format,args...) \ -"DEBUG(%d:%d)\033[" GST_DEBUG_CHAR_MODE ";%sm" __PRETTY_FUNCTION__ ":%d\033[00m" format , \ +"DEBUG(%5d:%2d)\033[" GST_DEBUG_CHAR_MODE ";%sm" __PRETTY_FUNCTION__ ":%d\033[00m" format , \ getpid() , cothread_getcurrent() , _gst_category_colors[cat] , __LINE__ , ## args #endif /* _GST_COLOR_CODE */ #else #define GST_DEBUG_PREFIX(cat,format,args...) \ -"DEBUG(%d:%d)" __PRETTY_FUNCTION__ ":%d" format , getpid() ,cothread_getcurrent() , __LINE__ , ## args +"DEBUG(%5d:%2d)" __PRETTY_FUNCTION__ ":%d" format , getpid() ,cothread_getcurrent() , __LINE__ , ## args #endif @@ -164,7 +164,7 @@ getpid() , cothread_getcurrent() , _gst_category_colors[cat] , __LINE__ , ## arg /********** function pointer stuff **********/ extern GHashTable *__gst_function_pointers; -#ifdef GST_DEBUG_ENABLED +#ifdef GST_DEBUG_ENABLED_dontuse #define GST_DEBUG_FUNCPTR(ptr) _gst_debug_register_funcptr((void *)(ptr), #ptr) #define GST_DEBUG_FUNCPTR_NAME(ptr) _gst_debug_nameof_funcptr((void *)ptr) #else @@ -181,14 +181,7 @@ _gst_debug_register_funcptr (void *ptr, gchar *ptrname) return ptr; } -static inline gchar * -_gst_debug_nameof_funcptr (void *ptr) -{ - gchar *ptrname = (gchar*)( __gst_function_pointers ? g_hash_table_lookup(__gst_function_pointers,ptr) : NULL ); -// FIXME this must go away, it's a major leak - if (!ptrname) return g_strdup_printf("%p",ptr); - else return ptrname; -} +gchar *_gst_debug_nameof_funcptr (void *ptr); /********************************************************************** diff --git a/gst/gstqueue.c b/gst/gstqueue.c index 1808120749..b9316c7550 100644 --- a/gst/gstqueue.c +++ b/gst/gstqueue.c @@ -391,7 +391,7 @@ gst_queue_change_state (GstElement *element) // can't call this queue's _get (or whatever) GST_LOCK (queue); - GST_DEBUG (0,"gstqueue: state pending %d\n", GST_STATE_PENDING (element)); + GST_DEBUG (GST_CAT_STATES,"gstqueue: state pending %d\n", GST_STATE_PENDING (element)); /* if going down into NULL state, clear out buffers*/ if (GST_STATE_PENDING (element) == GST_STATE_READY) { diff --git a/gst/gstscheduler.c b/gst/gstscheduler.c index 5cda5fda8a..2809142b2d 100644 --- a/gst/gstscheduler.c +++ b/gst/gstscheduler.c @@ -846,28 +846,33 @@ gst_schedule_new(GstElement *parent) /* this function will look at a pad and determine if the peer parent is * a possible candidate for connecting up in the same chain. */ +/* DEPRACATED !!!! GstElement *gst_schedule_check_pad (GstSchedule *sched, GstPad *pad) { GstRealPad *peer; - GstElement *peerelement; + GstElement *element, *peerelement; GST_INFO (GST_CAT_SCHEDULING, "checking pad %s:%s for peer in scheduler", GST_DEBUG_PAD_NAME(pad)); + element = GST_ELEMENT(GST_PAD_PARENT(peer)); + GST_DEBUG(GST_CAT_SCHEDULING, "element is \"%s\"\n",GST_ELEMENT_NAME(element)); + peer = GST_PAD_PEER (pad); if (peer == NULL) return NULL; peerelement = GST_ELEMENT(GST_PAD_PARENT (peer)); - - // first of all, if the peer element is decoupled, it will be in the same chain - if (GST_FLAG_IS_SET(peerelement,GST_ELEMENT_DECOUPLED)) - return peerelement; + if (peerelement == NULL) return NULL; + GST_DEBUG(GST_CAT_SCHEDULING, "peer element is \"%s\"\n",GST_ELEMENT_NAME(peerelement)); // now check to see if it's in the same schedule - if (g_list_find(sched->elements,peerelement)) + if (GST_ELEMENT_SCHED(element) == GST_ELEMENT_SCHED(peerelement)) { + GST_DEBUG(GST_CAT_SCHEDULING, "peer is in same schedule\n"); return peerelement; + } // otherwise it's not a candidate return NULL; } +*/ GstScheduleChain * gst_schedule_chain_new (GstSchedule *sched) @@ -887,7 +892,8 @@ gst_schedule_chain_new (GstSchedule *sched) sched->chains = g_list_prepend (sched->chains, chain); sched->num_chains++; - GST_INFO (GST_CAT_SCHEDULING, "created new chain, now are %d chains",sched->num_chains); + GST_INFO (GST_CAT_SCHEDULING, "created new chain %p, now are %d chains in sched %p", + chain,sched->num_chains,sched); return chain; } @@ -895,6 +901,8 @@ gst_schedule_chain_new (GstSchedule *sched) void gst_schedule_chain_destroy (GstScheduleChain *chain) { + GST_INFO (GST_CAT_SCHEDULING, "destroying chain %p",chain); + // remove the chain from the schedules' list of chains chain->sched->chains = g_list_remove (chain->sched->chains, chain); chain->sched->num_chains--; @@ -908,7 +916,7 @@ gst_schedule_chain_destroy (GstScheduleChain *chain) void gst_schedule_chain_add_element (GstScheduleChain *chain, GstElement *element) { - GST_INFO (GST_CAT_SCHEDULING, "adding element \"%s\" to chain", GST_ELEMENT_NAME (element)); + GST_INFO (GST_CAT_SCHEDULING, "adding element \"%s\" to chain %p", GST_ELEMENT_NAME (element),chain); // set the sched pointer for the element element->sched = chain->sched; @@ -921,7 +929,7 @@ gst_schedule_chain_add_element (GstScheduleChain *chain, GstElement *element) void gst_schedule_chain_enable_element (GstScheduleChain *chain, GstElement *element) { - GST_INFO (GST_CAT_SCHEDULING, "enabling element \"%s\" in chain", GST_ELEMENT_NAME (element)); + GST_INFO (GST_CAT_SCHEDULING, "enabling element \"%s\" in chain %p", GST_ELEMENT_NAME (element),chain); // remove from disabled list chain->disabled = g_list_remove (chain->disabled, element); @@ -936,7 +944,7 @@ gst_schedule_chain_enable_element (GstScheduleChain *chain, GstElement *element) void gst_schedule_chain_disable_element (GstScheduleChain *chain, GstElement *element) { - GST_INFO (GST_CAT_SCHEDULING, "disabling element \"%s\" in chain", GST_ELEMENT_NAME (element)); + GST_INFO (GST_CAT_SCHEDULING, "disabling element \"%s\" in chain %p", GST_ELEMENT_NAME (element),chain); // remove from elements list chain->elements = g_list_remove (chain->elements, element); @@ -952,7 +960,7 @@ gst_schedule_chain_disable_element (GstScheduleChain *chain, GstElement *element void gst_schedule_chain_remove_element (GstScheduleChain *chain, GstElement *element) { - GST_INFO (GST_CAT_SCHEDULING, "removing element \"%s\" from chain", GST_ELEMENT_NAME (element)); + GST_INFO (GST_CAT_SCHEDULING, "removing element \"%s\" from chain %p", GST_ELEMENT_NAME (element),chain); // if it's active, deactivate it if (g_list_find (chain->elements, element)) { @@ -1013,7 +1021,7 @@ gst_schedule_chain_elements (GstSchedule *sched, GstElement *element1, GstElemen // otherwise if both have chains already, join them } else if ((chain1 != NULL) && (chain2 != NULL)) { - GST_INFO (GST_CAT_SCHEDULING, "joining two existing chains together"); + GST_INFO (GST_CAT_SCHEDULING, "merging chain %p into chain %p\n",chain2,chain1); // take the contents of chain2 and merge them into chain1 chain1->disabled = g_list_concat (chain1->disabled, g_list_copy(chain2->disabled)); chain1->elements = g_list_concat (chain1->elements, g_list_copy(chain2->elements)); @@ -1039,13 +1047,20 @@ gst_schedule_chain_elements (GstSchedule *sched, GstElement *element1, GstElemen void gst_schedule_pad_connect (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad) { - GstElement *peerelement; + GstElement *srcelement,*sinkelement; - GST_INFO (GST_CAT_SCHEDULING, "have pad connected callback on %s:%s",GST_DEBUG_PAD_NAME(srcpad)); + srcelement = GST_PAD_PARENT(srcpad); + g_return_if_fail(srcelement != NULL); + sinkelement = GST_PAD_PARENT(sinkpad); + g_return_if_fail(sinkelement != NULL); - if ((peerelement = gst_schedule_check_pad(sched,srcpad))) { + GST_INFO (GST_CAT_SCHEDULING, "have pad connected callback on %s:%s to %s:%s",GST_DEBUG_PAD_NAME(srcpad),GST_DEBUG_PAD_NAME(sinkpad)); + GST_DEBUG(GST_CAT_SCHEDULING, "srcpad sched is %p, sinkpad sched is %p\n", +GST_ELEMENT_SCHED(srcelement),GST_ELEMENT_SCHED(sinkelement)); + + if (GST_ELEMENT_SCHED(srcelement) == GST_ELEMENT_SCHED(sinkelement)) { GST_INFO (GST_CAT_SCHEDULING, "peer %s:%s is in same schedule, chaining together",GST_DEBUG_PAD_NAME(sinkpad)); - gst_schedule_chain_elements (sched, GST_ELEMENT(GST_PAD_PARENT(srcpad)), peerelement); + gst_schedule_chain_elements (sched, srcelement, sinkelement); } } @@ -1088,11 +1103,13 @@ gst_schedule_chain_recursive_add (GstScheduleChain *chain, GstElement *element) pad = GST_PAD(pads->data); pads = g_list_next (pads); - // if it's a potential peer - if ((peerelement = gst_schedule_check_pad (chain->sched, pad))) { - // if it's not already in a chain, add it to this one - if (gst_schedule_find_chain (chain->sched, peerelement) == NULL) { - gst_schedule_chain_recursive_add (chain, peerelement); + // if the peer exists and could be in the same chain + if (GST_PAD_PEER(pad)) { + if (GST_ELEMENT_SCHED(GST_PAD_PARENT(pad)) == GST_ELEMENT_SCHED(GST_PAD_PARENT(GST_PAD_PEER(pad)))) { + // if it's not already in a chain, add it to this one + if (gst_schedule_find_chain (chain->sched, peerelement) == NULL) { + gst_schedule_chain_recursive_add (chain, peerelement); + } } } } @@ -1184,11 +1201,13 @@ gst_schedule_add_element (GstSchedule *sched, GstElement *element) // set the pad's sched pointer gst_pad_set_sched (pad, sched); - // if the peer element is a candidate - if ((peerelement = gst_schedule_check_pad(sched,pad))) { - GST_INFO (GST_CAT_SCHEDULING, "peer is in same schedule, chaining together"); - // make sure that the two elements are in the same chain - gst_schedule_chain_elements (sched,element,peerelement); + // if the peer element exists and is a candidate + if (GST_PAD_PEER(pad)) { + if (GST_ELEMENT_SCHED(GST_PAD_PARENT(pad)) == GST_ELEMENT_SCHED(GST_PAD_PARENT(GST_PAD_PEER(pad)))) { + GST_INFO (GST_CAT_SCHEDULING, "peer is in same schedule, chaining together"); + // make sure that the two elements are in the same chain + gst_schedule_chain_elements (sched,element,peerelement); + } } } } @@ -1282,17 +1301,16 @@ g_return_val_if_fail (chains != NULL, FALSE); if (chain->elements) { entry = NULL; //MattH ADDED? +GST_DEBUG(GST_CAT_SCHEDULING,"there are %d elements in this chain\n",chain->num_elements); elements = chain->elements; -//printf("searching for non-decoupled element\n"); while (elements) { entry = GST_ELEMENT(elements->data); elements = g_list_next(elements); -//printf("checking %s\n",GST_ELEMENT_NAME(entry)); - if (!GST_FLAG_IS_SET(entry,GST_ELEMENT_DECOUPLED)) break; + if (GST_FLAG_IS_SET(entry,GST_ELEMENT_DECOUPLED)) + GST_DEBUG(GST_CAT_SCHEDULING,"entry \"%s\" is DECOUPLED, skipping\n",GST_ELEMENT_NAME(entry)); + else + break; } -//printf("found non-decoupled element\n"); -// FIXME FIXME FIXME need to not use a DECOUPLED element as entry -// entry = GST_ELEMENT (chain->elements->data); if (entry) { GST_FLAG_SET (entry, GST_ELEMENT_COTHREAD_STOPPING); GST_DEBUG (GST_CAT_DATAFLOW,"set COTHREAD_STOPPING flag on \"%s\"(@%p)\n", @@ -1393,6 +1411,8 @@ gst_schedule_show (GstSchedule *sched) g_return_if_fail(GST_IS_SCHEDULE(sched)); + g_print("SCHEDULE DUMP FOR MANAGING BIN \"%s\"\n",GST_ELEMENT_NAME(sched->parent)); + g_print("schedule has %d elements in it: ",sched->num_elements); elements = sched->elements; while (elements) { @@ -1409,6 +1429,8 @@ gst_schedule_show (GstSchedule *sched) chain = (GstScheduleChain *)(chains->data); chains = g_list_next(chains); + g_print("%p: ",chain); + elements = chain->disabled; while (elements) { element = GST_ELEMENT(elements->data); diff --git a/gst/gstscheduler.h b/gst/gstscheduler.h index 2a98f830b6..d980c21c0f 100644 --- a/gst/gstscheduler.h +++ b/gst/gstscheduler.h @@ -77,6 +77,7 @@ struct _GstScheduleClass { //#define GST_SCHEDULE_SAFETY if (sched) #define GST_SCHEDULE_SAFETY + #define GST_SCHEDULE_ADD_ELEMENT(sched,element) \ GST_SCHEDULE_SAFETY ((sched)->add_element((sched),(element))) #define GST_SCHEDULE_REMOVE_ELEMENT(sched,element) \ @@ -85,14 +86,12 @@ struct _GstScheduleClass { GST_SCHEDULE_SAFETY ((sched)->enable_element((sched),(element))) #define GST_SCHEDULE_DISABLE_ELEMENT(sched,element) \ GST_SCHEDULE_SAFETY ((sched)->disable_element((sched),(element))) - #define GST_SCHEDULE_LOCK_ELEMENT(sched,element) \ -if ((sched)->lock_element != NULL) \ -((sched)->lock_element((sched),(element))) + GST_SCHEDULE_SAFETY if ((sched)->lock_element != NULL) \ + ((sched)->lock_element((sched),(element))) #define GST_SCHEDULE_UNLOCK_ELEMENT(sched,element) \ -if ((sched)->unlock_element != NULL) \ -((sched)->unlock_element((sched),(element))) - + GST_SCHEDULE_SAFETY if ((sched)->unlock_element != NULL) \ + ((sched)->unlock_element((sched),(element))) #define GST_SCHEDULE_PAD_CONNECT(sched,srcpad,sinkpad) \ GST_SCHEDULE_SAFETY ((sched)->pad_connect((sched),(srcpad),(sinkpad))) #define GST_SCHEDULE_PAD_DISCONNECT(sched,srcpad,sinkpad) \ diff --git a/gstreamer.pc.in b/gstreamer.pc.in index ccdc82065d..47ed44b0fa 100644 --- a/gstreamer.pc.in +++ b/gstreamer.pc.in @@ -4,7 +4,7 @@ libdir=@libdir@ includedir=@includedir@ Name: GStreamer -Description: Streamer-media framework +Description: Streaming-media framework Requires: Version: @VERSION@ Libs: -L${libdir} -lgst diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index 1808120749..b9316c7550 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -391,7 +391,7 @@ gst_queue_change_state (GstElement *element) // can't call this queue's _get (or whatever) GST_LOCK (queue); - GST_DEBUG (0,"gstqueue: state pending %d\n", GST_STATE_PENDING (element)); + GST_DEBUG (GST_CAT_STATES,"gstqueue: state pending %d\n", GST_STATE_PENDING (element)); /* if going down into NULL state, clear out buffers*/ if (GST_STATE_PENDING (element) == GST_STATE_READY) { diff --git a/test/.gitignore b/test/.gitignore index fee68ef295..01847776af 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -28,6 +28,8 @@ buffer mp3parse mpeg2parse mpeg2parse2 +mpeg2parse3 +mpeg2parse4 mp3play ac3parse ac3play diff --git a/test/Makefile.am b/test/Makefile.am index 4558f19e65..0a6704ad68 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2,7 +2,7 @@ if HAVE_GNOME GNOME_PROGS = spectrum wave mpeg2parse mp1parse videotest aviparse \ - mpeg2parse2 videotest2 video2mp1 dvshow dv2mp1 mpeg2parse3 + mpeg2parse2 videotest2 video2mp1 dvshow dv2mp1 mpeg2parse3 mpeg2parse4 else GNOME_PROGS = endif diff --git a/test/mpeg2parse3.c b/test/mpeg2parse3.c index dd588169fe..c74aacfe54 100644 --- a/test/mpeg2parse3.c +++ b/test/mpeg2parse3.c @@ -19,7 +19,6 @@ gboolean idle_func(gpointer data) { void mpeg2parse_newpad(GstElement *parser,GstPad *pad, GstElement *pipeline) { g_print("***** a new pad %s was created\n", gst_pad_get_name(pad)); -// gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PAUSED); if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { gst_pad_connect(pad, gst_element_get_pad(v_queue,"sink")); @@ -30,7 +29,6 @@ void mpeg2parse_newpad(GstElement *parser,GstPad *pad, GstElement *pipeline) { gst_bin_add(GST_BIN(pipeline),a_thread); gst_element_set_state(a_thread,GST_STATE_PLAYING); } -// gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PLAYING); } void mpeg2parse_have_size(GstElement *videosink,gint width,gint height) { diff --git a/test/mpeg2parse4.c b/test/mpeg2parse4.c new file mode 100644 index 0000000000..f918a11acb --- /dev/null +++ b/test/mpeg2parse4.c @@ -0,0 +1,224 @@ +#include +#include + +GstElement *pipeline, *src, *parse; +GstElement *v_decode_thread, *v_decode_queue, *v_decode, *v_color; +GstElement *v_show_thread, *v_show_queue, *v_show; +GstElement *a_decode_thread, *a_decode_queue, *a_decode; +GstElement *a_sink_thread, *a_sink_queue, *a_sink; +GtkWidget *appwindow; +GtkWidget *gtk_socket; + +void eof(GstElement *src) { + fprintf(stderr,"have eos, quitting\n"); + exit(0); +} + +gboolean idle_func(gpointer data) { + gst_bin_iterate(GST_BIN(data)); + return TRUE; +} + +int mpeg2parse_newpad(GstElement *parser,GstPad *pad, GstElement *pipeline) { + + fprintf(stderr,"***** a new pad %s was created\n", gst_pad_get_name(pad)); + + if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { + + // build the decoder thread + v_decode_thread = GST_ELEMENT(gst_thread_new("v_decode_thread")); + g_return_val_if_fail(v_decode_thread != NULL, -1); + + v_decode_queue = gst_elementfactory_make("queue","v_decode_queue"); + g_return_val_if_fail(v_decode_queue != NULL, -1); + + v_decode = gst_elementfactory_make("mpeg2dec","v_decode"); + g_return_val_if_fail(v_decode != NULL, -1); + + v_color = gst_elementfactory_make("colorspace","v_color"); + g_return_val_if_fail(v_color != NULL, -1); + + gst_bin_add(GST_BIN(v_decode_thread),GST_ELEMENT(v_decode_queue)); + gst_bin_add(GST_BIN(v_decode_thread),GST_ELEMENT(v_decode)); + gst_bin_add(GST_BIN(v_decode_thread),GST_ELEMENT(v_color)); + + gst_element_connect(v_decode_queue,"src",v_decode,"sink"); + gst_element_connect(v_decode,"src",v_color,"sink"); + + gst_schedule_show(GST_ELEMENT_SCHED(v_decode_thread)); + + + // build the show thread + v_show_thread = GST_ELEMENT(gst_thread_new("v_show_thread")); + g_return_val_if_fail(v_show_thread != NULL, -1); + + v_show_queue = gst_elementfactory_make("queue","v_show_queue"); + g_return_val_if_fail(v_show_queue != NULL, -1); + + // v_show has ben created earlier + + gst_bin_add(GST_BIN(v_show_thread),GST_ELEMENT(v_show_queue)); + gst_bin_add(GST_BIN(v_show_thread),GST_ELEMENT(v_show)); + + gst_element_connect(v_show_queue,"src",v_show,"sink"); + + + // now assemble the decoder threads + gst_bin_add(GST_BIN(v_decode_thread),v_show_thread); + gst_element_connect(v_color,"src",v_show_queue,"sink"); + + gst_schedule_show(GST_ELEMENT_SCHED(v_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(v_show_thread)); + + // connect the whole thing to the main pipeline + gst_pad_connect(pad, gst_element_get_pad(v_decode_queue,"sink")); + gst_bin_add(GST_BIN(pipeline),v_decode_thread); + + gst_schedule_show(GST_ELEMENT_SCHED(v_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(v_show_thread)); + + // start it playing + gst_element_set_state(v_decode_thread,GST_STATE_PLAYING); + + } else if (strcmp(gst_pad_get_name(pad), "private_stream_1.0") == 0) { + // build the decoder thread + a_decode_thread = GST_ELEMENT(gst_thread_new("a_decode_thread")); + g_return_val_if_fail(a_decode_thread != NULL, -1); + + a_decode_queue = gst_elementfactory_make("queue","a_decode_queue"); + g_return_val_if_fail(a_decode_queue != NULL, -1); + + a_decode = gst_elementfactory_make("ac3dec","a_decode"); + g_return_val_if_fail(a_decode != NULL, -1); + + gst_bin_add(GST_BIN(a_decode_thread),GST_ELEMENT(a_decode_queue)); + gst_bin_add(GST_BIN(a_decode_thread),GST_ELEMENT(a_decode)); + + gst_element_connect(a_decode_queue,"src",a_decode,"sink"); + + gst_schedule_show(GST_ELEMENT_SCHED(a_decode_thread)); + + + // build the sink thread + a_sink_thread = GST_ELEMENT(gst_thread_new("a_sink_thread")); + g_return_val_if_fail(a_sink_thread != NULL, -1); + + a_sink_queue = gst_elementfactory_make("queue","a_sink_queue"); + g_return_val_if_fail(a_sink_queue != NULL, -1); + + a_sink = gst_elementfactory_make("esdsink","a_sink"); + g_return_val_if_fail(a_sink != NULL, -1); + + gst_bin_add(GST_BIN(a_sink_thread),GST_ELEMENT(a_sink_queue)); + gst_bin_add(GST_BIN(a_sink_thread),GST_ELEMENT(a_sink)); + + gst_element_connect(a_sink_queue,"src",a_sink,"sink"); + + + // now assemble the decoder threads + gst_bin_add(GST_BIN(a_decode_thread),a_sink_thread); + gst_element_connect(a_decode,"src",a_sink_queue,"sink"); + + gst_schedule_show(GST_ELEMENT_SCHED(a_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(a_sink_thread)); + + // connect the whole thing to the main pipeline + gst_pad_connect(pad, gst_element_get_pad(a_decode_queue,"sink")); + gst_bin_add(GST_BIN(pipeline),a_decode_thread); + + gst_schedule_show(GST_ELEMENT_SCHED(a_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(a_sink_thread)); + + // start it playing + gst_element_set_state(a_decode_thread,GST_STATE_PLAYING); + + } + + if (v_decode_thread && a_decode_thread) { + xmlSaveFile("mpeg2parse4.gst", gst_xml_write(GST_ELEMENT(pipeline))); +fprintf(stderr,"DUMP OF ALL SCHEDULES!!!:\n"); + gst_schedule_show(GST_ELEMENT_SCHED(pipeline)); + gst_schedule_show(GST_ELEMENT_SCHED(v_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(v_show_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(a_decode_thread)); + gst_schedule_show(GST_ELEMENT_SCHED(a_sink_thread)); + } + + return 0; +} + +void mpeg2parse_have_size(GstElement *videosink,gint width,gint height) { + gtk_widget_set_usize(gtk_socket,width,height); + gtk_widget_show_all(appwindow); +} + +int main(int argc,char *argv[]) { + + g_print("have %d args\n",argc); + + gst_init(&argc,&argv); + gnome_init("MPEG2 Video player","0.0.1",argc,argv); + + // ***** construct the main pipeline ***** + pipeline = gst_pipeline_new("pipeline"); + g_return_val_if_fail(pipeline != NULL, -1); + + if (strstr(argv[1],"video_ts")) { + src = gst_elementfactory_make("dvdsrc","src"); + g_print("using DVD source\n"); + } else { + src = gst_elementfactory_make("disksrc","src"); + } + + g_return_val_if_fail(src != NULL, -1); + gtk_object_set(GTK_OBJECT(src),"location",argv[1],NULL); + if (argc >= 3) { + gtk_object_set(GTK_OBJECT(src),"bytesperread",atoi(argv[2]),NULL); + g_print("block size is %d\n",atoi(argv[2])); + } + g_print("should be using file '%s'\n",argv[1]); + + parse = gst_elementfactory_make("mpeg2parse","parse"); + //parse = gst_elementfactory_make("mpeg1parse","parse"); + g_return_val_if_fail(parse != NULL, -1); + + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(src)); + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(parse)); + + gst_element_connect(src,"src",parse,"sink"); + + + // create v_show early so we can get and connect stuff + v_show = gst_elementfactory_make("xvideosink","v_show"); + g_return_val_if_fail(v_show != NULL, -1); + + + + // ***** construct the GUI ***** + appwindow = gnome_app_new("MPEG player","MPEG player"); + + gtk_socket = gtk_socket_new (); + gtk_widget_show (gtk_socket); + + gnome_app_set_contents(GNOME_APP(appwindow), + GTK_WIDGET(gtk_socket)); + + gtk_widget_realize (gtk_socket); + gtk_socket_steal (GTK_SOCKET (gtk_socket), + gst_util_get_int_arg (GTK_OBJECT(v_show), "xid")); + + gtk_signal_connect(GTK_OBJECT(parse),"new_pad",mpeg2parse_newpad, pipeline); + gtk_signal_connect(GTK_OBJECT(src),"eos",GTK_SIGNAL_FUNC(eof),NULL); + gtk_signal_connect(GTK_OBJECT(v_show),"have_size",mpeg2parse_have_size, pipeline); + + fprintf(stderr,"setting to PLAYING state\n"); + gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PLAYING); + + gtk_idle_add(idle_func,pipeline); + + gdk_threads_enter(); + gtk_main(); + gdk_threads_leave(); + + return 0; +} diff --git a/tests/mp1vid.c b/tests/mp1vid.c index 5d68a5da28..2ad61b420d 100644 --- a/tests/mp1vid.c +++ b/tests/mp1vid.c @@ -45,7 +45,7 @@ int main(int argc,char *argv[]) { pipeline = gst_pipeline_new("pipeline"); sourcethread = gst_elementfactory_make("thread","sourcethread"); src = gst_elementfactory_make("disksrc","src"); - gtk_object_set(GTK_OBJECT(src),"location","/opt/data/AlienSong.mpg",NULL); + gtk_object_set(GTK_OBJECT(src),"location","/home/omega/media/AlienSong.mpg",NULL); parse = gst_elementfactory_make("mpeg1parse","parse"); gtk_signal_connect(GTK_OBJECT(parse),"new_pad", @@ -65,8 +65,10 @@ int main(int argc,char *argv[]) { while (1) { // sleep(1); +fprintf(stderr,"setting to PAUSED\n"); gst_element_set_state(pipeline,GST_STATE_PAUSED);fprintf(stderr,"paused... "); // sleep(1); +fprintf(stderr,"setting to PLAYING\n"); gst_element_set_state(pipeline,GST_STATE_PLAYING);fprintf(stderr,"playing.\n"); }