From d224516279f8d73bd7c4592aae05c5560e5655ac Mon Sep 17 00:00:00 2001 From: Erik Walthinsen Date: Sat, 12 Feb 2000 23:09:57 +0000 Subject: [PATCH] Rearranged and updated mp1parse. Indentation is sane again (what editor and it now uses threads. Playback is clean ... Original commit message from CVS: Rearranged and updated mp1parse. Indentation is sane again (what editor are you using, Wim?), and it now uses threads. Playback is clean (at least, audio and video are running smoothly. Video is still a little choppy on my test stream (first 1MB from disk two of Mulan VCD), and it's still wildly out of sync, but it's looking VERY COOL. --- test/mp1parse.c | 153 +++++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 72 deletions(-) diff --git a/test/mp1parse.c b/test/mp1parse.c index fa384e1fb9..ded7e46382 100644 --- a/test/mp1parse.c +++ b/test/mp1parse.c @@ -1,11 +1,10 @@ #include extern gboolean _gst_plugin_spew; -GstPipeline *pipeline; void eof(GstSrc *src) { - g_print("have eof, quitting\n"); - exit(0); + g_print("have eos, quitting\n"); + exit(0); } void mp1parse_info_chain(GstPad *pad,GstBuffer *buf) { @@ -13,115 +12,123 @@ void mp1parse_info_chain(GstPad *pad,GstBuffer *buf) { gst_buffer_unref(buf); } -void new_pad_created(GstElement *parse, GstPad *pad) { - GstElementFactory *parsefactory, *decodefactory, *playfactory; +void new_pad_created(GstElement *parse,GstPad *pad,GstElement *pipeline) { GstElement *parse_audio, *parse_video, *decode, *decode_video, *play; - GstPipeline *audio_pipeline, *video_pipeline; + GstElement *audio_queue, *video_queue; + GstElement *audio_thread, *video_thread; GstPad *infopad; - g_print("a new pad %s was created\n", gst_pad_get_name(pad)); + g_print("***** a new pad %s was created\n", gst_pad_get_name(pad)); // connect to audio pad 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); - parsefactory = gst_elementfactory_find("mp3parse"); - g_return_if_fail(parsefactory != NULL); - decodefactory = gst_elementfactory_find("mpg123"); - g_return_if_fail(decodefactory != NULL); - playfactory = gst_elementfactory_find("audiosink"); - g_return_if_fail(playfactory != 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)); - parse_audio = gst_elementfactory_create(parsefactory,"parse_audio"); - g_return_if_fail(parse_audio != NULL); - decode = gst_elementfactory_create(decodefactory,"decode_audio"); - g_return_if_fail(decode != NULL); - play = gst_elementfactory_create(playfactory,"play_audio"); - g_return_if_fail(play != NULL); + // 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")); - audio_pipeline = gst_pipeline_new("audio_pipeline"); - g_return_if_fail(audio_pipeline != NULL); + // construct queue and connect everything in the main pipelie + audio_queue = gst_elementfactory_make("queue","audio_queue"); + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(audio_queue)); + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(audio_thread)); + gst_pad_connect(pad, + gst_element_get_pad(audio_queue,"sink")); + gst_pad_connect(gst_element_get_pad(audio_queue,"src"), + gst_element_get_pad(audio_thread,"sink")); - gst_bin_add(GST_BIN(audio_pipeline),GST_ELEMENT(parse_audio)); - gst_bin_add(GST_BIN(audio_pipeline),GST_ELEMENT(decode)); - gst_bin_add(GST_BIN(audio_pipeline),GST_ELEMENT(play)); - gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(audio_pipeline)); + // set up thread state and kick things off + gtk_object_set(GTK_OBJECT(audio_thread),"create_thread",TRUE,NULL); + g_print("setting to RUNNING state\n"); + gst_element_set_state(GST_ELEMENT(audio_thread),GST_STATE_RUNNING); + g_print("setting to PLAYING state\n"); + gst_element_set_state(GST_ELEMENT(audio_thread),GST_STATE_PLAYING); + } else if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { + infopad = gst_pad_new("sink",GST_PAD_SINK); + gst_pad_set_chain_function(infopad,mp1parse_info_chain); - gst_pad_connect(gst_element_get_pad(parse,gst_pad_get_name(pad)), - 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")); + // 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); - g_print("setting to RUNNING state\n"); - gst_element_set_state(GST_ELEMENT(audio_pipeline),GST_STATE_RUNNING); + // 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)); - } - else if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) { - - parsefactory = gst_elementfactory_find("mp1videoparse"); - g_return_if_fail(parsefactory != NULL); - decodefactory = gst_elementfactory_find("mpeg_play"); - g_return_if_fail(parsefactory != NULL); - - parse_video = gst_elementfactory_create(parsefactory,"parse_video"); - g_return_if_fail(parse_video != NULL); - decode = gst_elementfactory_create(decodefactory,"decode_video"); - g_return_if_fail(decode_video != NULL); - - video_pipeline = gst_pipeline_new("video_pipeline"); - g_return_if_fail(video_pipeline != NULL); - - infopad = gst_pad_new("sink",GST_PAD_SINK); - gst_pad_set_chain_function(infopad,mp1parse_info_chain); - - gst_bin_add(GST_BIN(video_pipeline),GST_ELEMENT(parse_video)); - gst_bin_add(GST_BIN(video_pipeline),GST_ELEMENT(decode)); - - gst_pad_connect(gst_element_get_pad(parse,gst_pad_get_name(pad)), - gst_element_get_pad(parse_video,"sink")); + // 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"), - infopad); + gst_element_get_pad(decode,"sink")); + gst_pad_connect(gst_element_get_pad(decode,"src"), + infopad); + // construct queue and connect everything in the main pipeline + video_queue = gst_elementfactory_make("queue","video_queue"); + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(video_queue)); + gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(video_thread)); + gst_pad_connect(pad, + gst_element_get_pad(video_queue,"sink")); + gst_pad_connect(gst_element_get_pad(video_queue,"src"), + gst_element_get_pad(video_thread,"sink")); - g_print("setting to RUNNING state\n"); - gst_element_set_state(GST_ELEMENT(video_pipeline),GST_STATE_RUNNING); + // set up thread state and kick things off + gtk_object_set(GTK_OBJECT(video_thread),"create_thread",TRUE,NULL); + g_print("setting to RUNNING state\n"); + gst_element_set_state(GST_ELEMENT(video_thread),GST_STATE_RUNNING); + g_print("setting to PLAYING state\n"); + gst_element_set_state(GST_ELEMENT(video_thread),GST_STATE_PLAYING); } + g_print("\n"); } int main(int argc,char *argv[]) { - GstElementFactory *srcfactory, *parsefactory; + GstPipeline *pipeline; GstElement *src, *parse; g_print("have %d args\n",argc); _gst_plugin_spew = TRUE; gst_init(&argc,&argv); -// gst_plugin_load("mp3parse"); gst_plugin_load_all(); pipeline = gst_pipeline_new("pipeline"); g_return_if_fail(pipeline != NULL); - srcfactory = gst_elementfactory_find("disksrc"); - g_return_if_fail(srcfactory != NULL); - parsefactory = gst_elementfactory_find("mpeg1parse"); - g_return_if_fail(parsefactory != NULL); - - src = gst_elementfactory_create(srcfactory,"src"); + src = gst_elementfactory_make("disksrc","src"); g_return_if_fail(src != NULL); gtk_object_set(GTK_OBJECT(src),"location",argv[1],NULL); g_print("should be using file '%s'\n",argv[1]); - parse = gst_elementfactory_create(parsefactory,"parse"); + + parse = gst_elementfactory_make("mpeg1parse","parse"); g_return_if_fail(parse != NULL); gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(src)); gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(parse)); gtk_signal_connect(GTK_OBJECT(parse),"new_pad", - GTK_SIGNAL_FUNC(new_pad_created),NULL); + GTK_SIGNAL_FUNC(new_pad_created),pipeline); gtk_signal_connect(GTK_OBJECT(src),"eos", GTK_SIGNAL_FUNC(eof),NULL); @@ -132,6 +139,8 @@ int main(int argc,char *argv[]) { g_print("setting to RUNNING state\n"); gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_RUNNING); + xmlSaveFile("mp1parse.xml",gst_xml_write(GST_ELEMENT(pipeline))); + g_print("about to enter loop\n"); while (1) gst_src_push(GST_SRC(src));