From 1f4d20f689d922b6a9d807a072880473dd62bfef Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 20 Mar 2000 20:25:03 +0000 Subject: [PATCH] Implemented riff parsing as a library. The avi parser can play simple PCM encoded audio. Original commit message from CVS: Implemented riff parsing as a library. The avi parser can play simple PCM encoded audio. some minor cleanups. --- configure.in | 6 +- gst/elements/gstaudiosink.c | 5 +- gst/elements/gstqueue.c | 9 ++- gst/gstbuffer.c | 2 +- gst/gstplugin.c | 36 ++++++--- gst/gstplugin.h | 1 + gst/gstthread.c | 2 +- gst/plugin.c | 139 -------------------------------- gst/plugin.h | 4 - libs/riff/gstriff.c | 69 +++++++++++++--- libs/riff/gstriff.h | 3 + plugins/elements/gstaudiosink.c | 5 +- plugins/elements/gstqueue.c | 9 ++- test/aviparse.c | 32 ++------ test/mp1parse.c | 9 ++- test/videotest.c | 5 +- 16 files changed, 135 insertions(+), 201 deletions(-) delete mode 100644 gst/plugin.c delete mode 100644 gst/plugin.h diff --git a/configure.in b/configure.in index a847de5956..66f845b6e2 100644 --- a/configure.in +++ b/configure.in @@ -140,7 +140,11 @@ AC_CHECK_HEADER(xaudio/decoder.h,[ ]) dnl Set location of plugin directory -PLUGINS_DIR=${prefix}/lib/gst +if test "x${prefix}" = "xNONE"; then + PLUGINS_DIR=${ac_default_prefix}/lib/gst +else + PLUGINS_DIR=${prefix}/lib/gst +fi AC_DEFINE_UNQUOTED(PLUGINS_DIR,"$PLUGINS_DIR") AC_SUBST(PLUGINS_DIR) diff --git a/gst/elements/gstaudiosink.c b/gst/elements/gstaudiosink.c index 445bab5905..3d1c05e875 100644 --- a/gst/elements/gstaudiosink.c +++ b/gst/elements/gstaudiosink.c @@ -187,12 +187,15 @@ void gst_audiosink_chain(GstPad *pad,GstBuffer *buf) { audiosink); if (GST_BUFFER_DATA(buf) != NULL) { gst_trace_add_entry(NULL,0,buf,"audiosink: writing to soundcard"); + //g_print("audiosink: writing to soundcard\n"); if (audiosink->fd > 2) write(audiosink->fd,GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf)); + //g_print("audiosink: writing to soundcard ok\n"); } + //g_print("a unref\n"); gst_buffer_unref(buf); -// g_print("a"); + //g_print("a done\n"); } void gst_audiosink_set_format(GstAudioSink *audiosink,gint format) { diff --git a/gst/elements/gstqueue.c b/gst/elements/gstqueue.c index 51b053f284..c6aef6f4e7 100644 --- a/gst/elements/gstqueue.c +++ b/gst/elements/gstqueue.c @@ -134,8 +134,10 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { /* we have to lock the queue since we span threads */ GST_LOCK(queue); + //g_print("queue: chain %d\n", queue->level_buffers); if (queue->level_buffers >= queue->max_buffers) { + //g_print("queue: waiting %d\n", queue->level_buffers); GST_UNLOCK(queue); while (queue->level_buffers >= queue->max_buffers) { g_mutex_lock(queue->fulllock); @@ -144,6 +146,7 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { g_mutex_unlock(queue->fulllock); } GST_LOCK(queue); + //g_print("queue: waiting done %d\n", queue->level_buffers); } @@ -164,6 +167,7 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { tosignal = (queue->level_buffers++ == 0); /* we can unlock now */ + //g_print("queue: chain %d end\n", queue->level_buffers); GST_UNLOCK(queue); if (tosignal) { @@ -182,6 +186,7 @@ void gst_queue_push(GstConnection *connection) { /* have to lock for thread-safety */ GST_LOCK(queue); + //g_print("queue: push %d\n", queue->level_buffers); if (!queue->level_buffers) { GST_UNLOCK(queue); @@ -197,12 +202,14 @@ void gst_queue_push(GstConnection *connection) { front = queue->queue; buf = (GstBuffer *)(front->data); queue->queue = g_list_remove_link(queue->queue,front); + //g_print("queue: pushing %d\n", queue->level_buffers); gst_pad_push(queue->srcpad,buf); + //g_print("queue: pushing %d done\n", queue->level_buffers); g_list_free(front); queue->level_buffers--; - //g_print("-"); tosignal = queue->level_buffers < queue->max_buffers; + //g_print("queue: push end %d\n", queue->level_buffers); GST_UNLOCK(queue); if (tosignal) { diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index 9a0a5e8e61..a3bc6d892d 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -151,7 +151,7 @@ void gst_buffer_destroy(GstBuffer *buffer) { gst_buffer_unref(buffer->parent); g_mutex_free(buffer->lock); -// g_print("freed mutex\n"); + //g_print("freed mutex\n"); // remove it entirely from memory g_mem_chunk_free(_gst_buffer_chunk,buffer); diff --git a/gst/gstplugin.c b/gst/gstplugin.c index 609d881047..9b3948b57d 100644 --- a/gst/gstplugin.c +++ b/gst/gstplugin.c @@ -71,13 +71,15 @@ static gboolean gst_plugin_load_recurse(gchar *directory,gchar *name) { struct dirent *dirent; gboolean loaded = FALSE; + //g_print("recursive load of '%s' in '%s'\n", name, directory); dir = opendir(directory); if (dir) { while ((dirent = readdir(dir))) { /* don't want to recurse in place or backwards */ if (strcmp(dirent->d_name,".") && strcmp(dirent->d_name,"..")) { - gst_plugin_load_recurse(g_strjoin("/",directory,dirent->d_name, + loaded = gst_plugin_load_recurse(g_strjoin("/",directory,dirent->d_name, NULL),name); + if (loaded && name) return TRUE; } } closedir(dir); @@ -87,13 +89,13 @@ static gboolean gst_plugin_load_recurse(gchar *directory,gchar *name) { if (name) { if ((temp = strstr(directory,name)) && (!strcmp(temp,name))) { - gst_plugin_load_absolute(directory); - return TRUE; + loaded = gst_plugin_load_absolute(directory); + return loaded; } } else if ((temp = strstr(directory,".so")) && (!strcmp(temp,".so"))) { - gst_plugin_load_absolute(directory); - loaded = TRUE; + loaded = gst_plugin_load_absolute(directory); + //return loaded; } } } @@ -115,6 +117,19 @@ void gst_plugin_load_all() { } } +/** + * gst_library_load: + * @name: name of liabrary to load + * + * Load the named liabrary. Name should be given as + * "libliabrary.so". + * + * Returns: whether the liabrary was loaded or not + */ +gboolean gst_library_load(gchar *name) { + // for now this is the same + return gst_plugin_load(name); +} /** * gst_plugin_load: * @name: name of plugin to load @@ -135,14 +150,14 @@ gboolean gst_plugin_load(gchar *name) { if (gst_plugin_load_absolute(g_module_build_path(path->data,name))) return TRUE; libspath = g_strconcat(path->data,"/.libs",NULL); -// g_print("trying to load '%s'\n",g_module_build_path(libspath,name)); + //g_print("trying to load '%s'\n",g_module_build_path(libspath,name)); if (gst_plugin_load_absolute(g_module_build_path(libspath,name))) { g_free(libspath); return TRUE; } g_free(libspath); -// g_print("trying to load '%s' from '%s'\n",name,path->data); - if (gst_plugin_load_recurse(path->data,name)) { + //g_print("trying to load '%s' from '%s'\n",name,path->data); + if (gst_plugin_load_recurse(path->data,g_module_build_path("",name))) { return TRUE; } path = g_list_next(path); @@ -161,14 +176,14 @@ gboolean gst_plugin_load_absolute(gchar *name) { GstPluginInitFunc initfunc; GstPlugin *plugin; -// g_print("trying to load '%s\n",name); + //g_print("trying to absolute load '%s\n",name); if (g_module_supported() == FALSE) { g_print("wow, you built this on a platform without dynamic loading???\n"); return FALSE; } - module = g_module_open(name,0); + module = g_module_open(name,G_MODULE_BIND_LAZY); if (module != NULL) { if (g_module_symbol(module,"plugin_init",(gpointer *)&initfunc)) { if ((plugin = (initfunc)(module))) { @@ -186,6 +201,7 @@ gboolean gst_plugin_load_absolute(gchar *name) { return TRUE; } } + return TRUE; } else if (_gst_plugin_spew) { // if (strstr(g_module_error(),"No such") == NULL) gst_info("error loading plugin: %s\n",g_module_error()); diff --git a/gst/gstplugin.h b/gst/gstplugin.h index eb57c130c8..9daa1b0f5e 100644 --- a/gst/gstplugin.h +++ b/gst/gstplugin.h @@ -52,6 +52,7 @@ void gst_plugin_set_longname(GstPlugin *plugin,gchar *longname); void _gst_plugin_initialize(); void gst_plugin_load_all(); gboolean gst_plugin_load(gchar *name); +gboolean gst_library_load(gchar *name); gboolean gst_plugin_load_absolute(gchar *name); void gst_plugin_add_factory(GstPlugin *plugin,GstElementFactory *factory); diff --git a/gst/gstthread.c b/gst/gstthread.c index 0a3c52acf2..bc1a9787ff 100644 --- a/gst/gstthread.c +++ b/gst/gstthread.c @@ -314,7 +314,7 @@ void gst_thread_iterate(GstThread *thread) { g_assert_not_reached(); entries = g_list_next(entries); } -// g_print(","); + //g_print(","); } static void gst_thread_signal_thread(GstThread *thread) { diff --git a/gst/plugin.c b/gst/plugin.c deleted file mode 100644 index 996e3f81f8..0000000000 --- a/gst/plugin.c +++ /dev/null @@ -1,139 +0,0 @@ -#include -#include -#include -#include - -/* list of paths to check for plugins */ -GList *_plugin_paths; - -/* whether or not to spew library load issues */ -gboolean _plugin_spew = FALSE; - - -void plugin_initialize() { - _plugin_paths = NULL; - - /* add the main (installed) library path */ - _plugin_paths = g_list_prepend(_plugin_paths,PLUGINS_DIR); - - /* if this is set, we add build-directory paths to the list */ -#ifdef PLUGINS_USE_SRCDIR - _plugin_paths = g_list_prepend(_plugin_paths,PLUGINS_SRCDIR); -#endif /* PLUGINS_USE_SRCDIR */ -} - -static GModule *plugin_load_recurse(gchar *directory,gchar *name) { - DIR *dir; - struct dirent *dirent; - GModule *mod; - - dir = opendir(directory); - if (dir) { - while (dirent = readdir(dir)) { - /* don't want to recurse in place or backwards */ - if (strcmp(dirent->d_name,".") && strcmp(dirent->d_name,"..")) { - mod = plugin_load_recurse(g_strjoin("/",directory,dirent->d_name, - NULL),name); - if (mod != NULL) { - closedir(dir); - return mod; - } - } - } - closedir(dir); - } else { - if (strstr(directory,".so")) { - gchar *temp; - if (name) { - if ((temp = strstr(directory,name)) && - (!strcmp(temp,name))) { - mod = plugin_load_absolute(directory); - if (mod != NULL) return mod; - } - } else if ((temp = strstr(directory,".so")) && - (!strcmp(temp,".so"))) { - mod = plugin_load_absolute(directory); - if (mod != NULL) return mod; - } - } - } - return NULL; -} - -/** - * plugin_load_all: - * - * Load all plugins in the path. - */ -void plugin_load_all() { - GList *path; - - path = _plugin_paths; - while (path != NULL) { - plugin_load_recurse(path->data,NULL); - path = g_list_next(path); - } -} - -/** - * plugin_load: - * @name: name of plugin to load - * - * Load the named plugin. Name should be given as - * "libplugin.so". - * - * Returns: whether the plugin was loaded or not - */ -GModule *plugin_load(gchar *name) { - GList *path; - gchar *libspath; - GModule *mod; - -// g_print("attempting to load plugin '%s'\n",name); - - path = _plugin_paths; - while (path != NULL) { - mod = plugin_load_absolute(g_module_build_path(path->data,name)); - if (mod != NULL) return mod; - libspath = g_strconcat(path->data,"/.libs",NULL); -// g_print("trying to load '%s'\n",g_module_build_path(libspath,name)); - mod = plugin_load_absolute(g_module_build_path(libspath,name)); - if (mod != NULL) { - g_free(libspath); - return mod; - } - g_free(libspath); -// g_print("trying to load '%s' from '%s'\n",name,path->data); - mod = plugin_load_recurse(path->data,name); - if (mod != NULL) return mod; - path = g_list_next(path); - } - return NULL; -} - -/** - * plugin_load_absolute: - * @name: name of plugin to load - * - * Returns: whether or not the plugin loaded - */ -GModule *plugin_load_absolute(gchar *name) { - GModule *mod; - -// g_print("trying to load '%s\n",name); - - if (g_module_supported() == FALSE) { - g_print("wow, you built this on a platform without dynamic loading???\n"); - return; - } - - mod = g_module_open(name,0); - if (mod != NULL) { - return mod; - } else if (_gst_plugin_spew) { -// if (strstr(g_module_error(),"No such") == NULL) - g_print("error loading plugin: %s\n",g_module_error()); - } - - return NULL; -} diff --git a/gst/plugin.h b/gst/plugin.h deleted file mode 100644 index d98d65f0b9..0000000000 --- a/gst/plugin.h +++ /dev/null @@ -1,4 +0,0 @@ -void plugin_initialize(); -void plugin_load_all(); -GModule *plugin_load(gchar *name); -GModule *plugin_load_absolute(gchar *name); diff --git a/libs/riff/gstriff.c b/libs/riff/gstriff.c index c09b6b9995..5e0dda95d4 100644 --- a/libs/riff/gstriff.c +++ b/libs/riff/gstriff.c @@ -34,26 +34,28 @@ GstRiff *gst_riff_new(GstRiffCallback function, gpointer data) { riff->nextlikely = 0; riff->new_tag_found = function; riff->callback_data = data; + riff->incomplete_chunk = NULL; return riff; } gint gst_riff_next_buffer(GstRiff *riff,GstBuffer *buf,gulong off) { - gulong last; + gulong last, size; GstRiffChunk *chunk; g_return_val_if_fail(riff != NULL, GST_RIFF_EINVAL); g_return_val_if_fail(buf != NULL, GST_RIFF_EINVAL); g_return_val_if_fail(GST_BUFFER_DATA(buf) != NULL, GST_RIFF_EINVAL); - last = off + GST_BUFFER_SIZE(buf); + size = GST_BUFFER_SIZE(buf); + last = off + size; - //g_print("offset new buffer 0x%08lx\n", off); + //g_print("offset new buffer 0x%08lx size 0x%08x\n", off, GST_BUFFER_SIZE(buf)); if (off == 0) { gulong *words = (gulong *)GST_BUFFER_DATA(buf); - // don't even try to parse the head if it's not there + // don't even try to parse the head if it's not there FIXME if (last < 12) { riff->state = GST_RIFF_ENOTRIFF; return riff->state; @@ -68,8 +70,34 @@ gint gst_riff_next_buffer(GstRiff *riff,GstBuffer *buf,gulong off) { riff->form = words[2]; //g_print("form is 0x%08lx '%s'\n",words[2],gst_riff_id_to_fourcc(words[2])); riff->nextlikely = 12; /* skip 'RIFF', length, and form */ + // all OK here + riff->incomplete_chunk = NULL; } + // if we have an incomplete chunk from the previous buffer + if (riff->incomplete_chunk) { + guint leftover; + //g_print("have incomplete chunk %08x filled\n", riff->incomplete_chunk_size); + leftover = riff->incomplete_chunk->size - riff->incomplete_chunk_size; + if (leftover <= size) { + //g_print("we can fill it from %08x with %08x bytes = %08x\n", riff->incomplete_chunk_size, leftover, riff->incomplete_chunk_size+leftover); + memcpy(riff->incomplete_chunk->data+riff->incomplete_chunk_size, GST_BUFFER_DATA(buf), leftover); + + if (riff->new_tag_found) { + riff->new_tag_found(riff->incomplete_chunk, riff->callback_data); + } + g_free(riff->incomplete_chunk->data); + g_free(riff->incomplete_chunk); + riff->incomplete_chunk = NULL; + } + else { + //g_print("we cannot fill it %08x >= %08lx\n", leftover, size); + memcpy(riff->incomplete_chunk->data+riff->incomplete_chunk_size, GST_BUFFER_DATA(buf), size); + riff->incomplete_chunk_size += size; + return 0; + } + } + /* loop while the next likely chunk header is in this buffer */ while ((riff->nextlikely+12) < last) { gulong *words = (gulong *)((guchar *)GST_BUFFER_DATA(buf) + riff->nextlikely - off ); @@ -97,27 +125,44 @@ gint gst_riff_next_buffer(GstRiff *riff,GstBuffer *buf,gulong off) { chunk->size = words[1]; chunk->data = (gchar *)(words+2); // we need word alignment - if (chunk->size & 0x01) chunk->size++; + //if (chunk->size & 0x01) chunk->size++; chunk->form = words[2]; /* fill in the form, might not be valid */ - // send the buffer to the listener if we have received a function - if (riff->new_tag_found) { - riff->new_tag_found(chunk, riff->callback_data); - } if (chunk->id == GST_RIFF_TAG_LIST) { //g_print("found LIST %s\n", gst_riff_id_to_fourcc(chunk->form)); riff->nextlikely += 12; // we push the list chunk on our 'stack' riff->chunks = g_list_prepend(riff->chunks,chunk); + // send the buffer to the listener if we have received a function + if (riff->new_tag_found) { + riff->new_tag_found(chunk, riff->callback_data); + } } else { - //g_print("chunk id is 0x%08lx '%s' and is 0x%08lx long\n",words[0], - // gst_riff_id_to_fourcc(words[0]),words[1]); + //g_print("chunk id offset %08x is 0x%08lx '%s' and is 0x%08lx long\n",riff->nextlikely, words[0], + // gst_riff_id_to_fourcc(words[0]),words[1]); riff->nextlikely += 8 + chunk->size; /* doesn't include hdr */ - g_free(chunk); + // if this buffer is incomplete + if (riff->nextlikely > last) { + guint left = size - (riff->nextlikely - 0 - chunk->size - off); + + //g_print("make incomplete buffer %08x\n", left); + chunk->data = g_malloc(chunk->size); + memcpy(chunk->data, (gchar *)(words+2), left); + riff->incomplete_chunk = chunk; + riff->incomplete_chunk_size = left; + } + else { + // send the buffer to the listener if we have received a function + if (riff->new_tag_found) { + riff->new_tag_found(chunk, riff->callback_data); + } + g_free(chunk); + } + //riff->chunks = g_list_prepend(riff->chunks,chunk); } } diff --git a/libs/riff/gstriff.h b/libs/riff/gstriff.h index 1d5281dfaf..82afb3760f 100644 --- a/libs/riff/gstriff.h +++ b/libs/riff/gstriff.h @@ -286,6 +286,9 @@ struct _GstRiff { /* list of chunks, most recent at the head */ GList *chunks; + /* incomplete chunks are assembled here */ + GstRiffChunk *incomplete_chunk; + guint32 incomplete_chunk_size; /* parse state */ gint state; guint32 curoffset; diff --git a/plugins/elements/gstaudiosink.c b/plugins/elements/gstaudiosink.c index 445bab5905..3d1c05e875 100644 --- a/plugins/elements/gstaudiosink.c +++ b/plugins/elements/gstaudiosink.c @@ -187,12 +187,15 @@ void gst_audiosink_chain(GstPad *pad,GstBuffer *buf) { audiosink); if (GST_BUFFER_DATA(buf) != NULL) { gst_trace_add_entry(NULL,0,buf,"audiosink: writing to soundcard"); + //g_print("audiosink: writing to soundcard\n"); if (audiosink->fd > 2) write(audiosink->fd,GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf)); + //g_print("audiosink: writing to soundcard ok\n"); } + //g_print("a unref\n"); gst_buffer_unref(buf); -// g_print("a"); + //g_print("a done\n"); } void gst_audiosink_set_format(GstAudioSink *audiosink,gint format) { diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index 51b053f284..c6aef6f4e7 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -134,8 +134,10 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { /* we have to lock the queue since we span threads */ GST_LOCK(queue); + //g_print("queue: chain %d\n", queue->level_buffers); if (queue->level_buffers >= queue->max_buffers) { + //g_print("queue: waiting %d\n", queue->level_buffers); GST_UNLOCK(queue); while (queue->level_buffers >= queue->max_buffers) { g_mutex_lock(queue->fulllock); @@ -144,6 +146,7 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { g_mutex_unlock(queue->fulllock); } GST_LOCK(queue); + //g_print("queue: waiting done %d\n", queue->level_buffers); } @@ -164,6 +167,7 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) { tosignal = (queue->level_buffers++ == 0); /* we can unlock now */ + //g_print("queue: chain %d end\n", queue->level_buffers); GST_UNLOCK(queue); if (tosignal) { @@ -182,6 +186,7 @@ void gst_queue_push(GstConnection *connection) { /* have to lock for thread-safety */ GST_LOCK(queue); + //g_print("queue: push %d\n", queue->level_buffers); if (!queue->level_buffers) { GST_UNLOCK(queue); @@ -197,12 +202,14 @@ void gst_queue_push(GstConnection *connection) { front = queue->queue; buf = (GstBuffer *)(front->data); queue->queue = g_list_remove_link(queue->queue,front); + //g_print("queue: pushing %d\n", queue->level_buffers); gst_pad_push(queue->srcpad,buf); + //g_print("queue: pushing %d done\n", queue->level_buffers); g_list_free(front); queue->level_buffers--; - //g_print("-"); tosignal = queue->level_buffers < queue->max_buffers; + //g_print("queue: push end %d\n", queue->level_buffers); GST_UNLOCK(queue); if (tosignal) { diff --git a/test/aviparse.c b/test/aviparse.c index 4af7f47d79..51d5ef9f03 100644 --- a/test/aviparse.c +++ b/test/aviparse.c @@ -23,27 +23,17 @@ void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { //if (0) { if (strncmp(gst_pad_get_name(pad), "audio_", 6) == 0) { // construct internal pipeline elements - parse_audio = gst_elementfactory_make("mp3parse","parse_audio"); - g_return_if_fail(parse_audio != NULL); - decode = gst_elementfactory_make("mpg123","decode_audio"); - g_return_if_fail(decode != NULL); play = gst_elementfactory_make("audiosink","play_audio"); g_return_if_fail(play != NULL); // create the thread and pack stuff into it audio_thread = gst_thread_new("audio_thread"); g_return_if_fail(audio_thread != NULL); - gst_bin_add(GST_BIN(audio_thread),GST_ELEMENT(parse_audio)); - gst_bin_add(GST_BIN(audio_thread),GST_ELEMENT(decode)); gst_bin_add(GST_BIN(audio_thread),GST_ELEMENT(play)); // set up pad connections gst_element_add_ghost_pad(GST_ELEMENT(audio_thread), - gst_element_get_pad(parse_audio,"sink")); - gst_pad_connect(gst_element_get_pad(parse_audio,"src"), - gst_element_get_pad(decode,"sink")); - gst_pad_connect(gst_element_get_pad(decode,"src"), - gst_element_get_pad(play,"sink")); + gst_element_get_pad(play,"sink")); // construct queue and connect everything in the main pipelie audio_queue = gst_elementfactory_make("queue","audio_queue"); @@ -63,16 +53,13 @@ void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { } else if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { //} else if (0) { + gst_plugin_load("videosink"); // construct internal pipeline elements - parse_video = gst_elementfactory_make("mp1videoparse","parse_video"); - g_return_if_fail(parse_video != NULL); - decode = gst_elementfactory_make("mpeg_play","decode_video"); - g_return_if_fail(decode_video != NULL); show = gst_elementfactory_make("videosink","show"); g_return_if_fail(show != NULL); //gtk_object_set(GTK_OBJECT(show),"width",640, "height", 480,NULL); - appwindow = gnome_app_new("MPEG1 player","MPEG1 player"); + appwindow = gnome_app_new("AVI player","AVI player"); gnome_app_set_contents(GNOME_APP(appwindow), gst_util_get_widget_arg(GTK_OBJECT(show),"widget")); gtk_widget_show_all(appwindow); @@ -80,17 +67,11 @@ void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { // create the thread and pack stuff into it video_thread = gst_thread_new("video_thread"); g_return_if_fail(video_thread != NULL); - gst_bin_add(GST_BIN(video_thread),GST_ELEMENT(parse_video)); - gst_bin_add(GST_BIN(video_thread),GST_ELEMENT(decode)); gst_bin_add(GST_BIN(video_thread),GST_ELEMENT(show)); // set up pad connections gst_element_add_ghost_pad(GST_ELEMENT(video_thread), - gst_element_get_pad(parse_video,"sink")); - gst_pad_connect(gst_element_get_pad(parse_video,"src"), - gst_element_get_pad(decode,"sink")); - gst_pad_connect(gst_element_get_pad(decode,"src"), - gst_element_get_pad(show,"sink")); + gst_element_get_pad(show,"sink")); // construct queue and connect everything in the main pipeline video_queue = gst_elementfactory_make("queue","video_queue"); @@ -117,10 +98,11 @@ int main(int argc,char *argv[]) { g_print("have %d args\n",argc); - _gst_plugin_spew = TRUE; + //_gst_plugin_spew = TRUE; gst_init(&argc,&argv); gnome_init("AVI Video player","0.0.1",argc,argv); - gst_plugin_load_all(); + //gst_plugin_load_all(); + gst_plugin_load("parseavi"); pipeline = gst_pipeline_new("pipeline"); g_return_if_fail(pipeline != NULL); diff --git a/test/mp1parse.c b/test/mp1parse.c index 1af6a32c31..1483be8772 100644 --- a/test/mp1parse.c +++ b/test/mp1parse.c @@ -22,6 +22,8 @@ void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { // connect to audio pad //if (0) { if (strncmp(gst_pad_get_name(pad), "audio_", 6) == 0) { + gst_plugin_load("mp3parse"); + gst_plugin_load("mpg123"); // construct internal pipeline elements parse_audio = gst_elementfactory_make("mp3parse","parse_audio"); g_return_if_fail(parse_audio != NULL); @@ -63,6 +65,9 @@ void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { } else if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { //} else if (0) { + gst_plugin_load("mp1videoparse"); + gst_plugin_load("mpeg_play"); + gst_plugin_load("videosink"); // construct internal pipeline elements parse_video = gst_elementfactory_make("mp1videoparse","parse_video"); g_return_if_fail(parse_video != NULL); @@ -117,10 +122,10 @@ int main(int argc,char *argv[]) { g_print("have %d args\n",argc); - _gst_plugin_spew = TRUE; + //_gst_plugin_spew = TRUE; gst_init(&argc,&argv); gnome_init("MPEG1 Video player","0.0.1",argc,argv); - gst_plugin_load_all(); + gst_plugin_load("mpeg1parse"); pipeline = gst_pipeline_new("pipeline"); g_return_if_fail(pipeline != NULL); diff --git a/test/videotest.c b/test/videotest.c index 9912f3c6fb..0acdb8cc10 100644 --- a/test/videotest.c +++ b/test/videotest.c @@ -19,9 +19,10 @@ int main(int argc,char *argv[]) { GtkWidget *draw; - _gst_plugin_spew = TRUE; + //_gst_plugin_spew = TRUE; gst_init(&argc,&argv); - gst_plugin_load_all(); + gst_plugin_load("v4lsrc"); + gst_plugin_load("videosink"); gnome_init("Videotest","0.0.1",argc,argv);