From: Steve B. <sb...@us...> - 2002-06-01 13:57:33
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sat Jun 01 2002 06:57:31 PDT Log message: use a thread for audio output, and a thread for video output. Video now looks real good! and the sync can't be faulted either. Modified files: libs/gst/play : play.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- play.c 1 Jun 2002 12:55:15 -0000 1.2 +++ play.c 1 Jun 2002 13:57:19 -0000 1.3 @@ -179,59 +179,56 @@ /* create source element */ play->source = gst_element_factory_make ("filesrc", "source"); g_return_val_if_fail (play->source != NULL, NULL); + gst_bin_add (GST_BIN (play->pipeline), play->source); - /* create audio element */ + /* create audio elements */ + play->volume = gst_element_factory_make ("volume", "volume"); + play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + g_signal_connect (G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); + + play->audio_queue = gst_element_factory_make ("queue", "audio_queue"); + + play->audio_bin = gst_thread_new ("audio_bin"); + g_return_val_if_fail (play->audio_bin != NULL, NULL); + + gst_bin_add_many (GST_BIN (play->audio_bin), play->audio_queue, play->volume, play->audio_sink, NULL); + gst_element_connect_many (play->audio_queue, play->volume, play->audio_sink, NULL); + gst_element_add_ghost_pad (play->audio_bin, + gst_element_get_pad (play->audio_queue, "sink"), + "sink"); + + gst_bin_add (GST_BIN (play->pipeline), play->audio_bin); /* create video elements */ - play->video_bin = gst_element_factory_make ("bin", "video_bin"); + play->video_bin = gst_element_factory_make ("thread", "video_bin"); g_return_val_if_fail (play->video_bin != NULL, NULL); - GST_FLAG_SET (play->video_bin, GST_ELEMENT_THREAD_SUGGESTED); play->video_sink = gst_element_factory_make ("videosink", "show"); g_return_val_if_fail (play->video_sink != NULL, NULL); - gst_bin_add (GST_BIN (play->video_bin), play->video_sink); + play->video_queue = gst_element_factory_make ("queue", "video_queue"); + + gst_bin_add_many (GST_BIN (play->video_bin), play->video_queue, play->video_sink, NULL); + gst_element_add_ghost_pad (play->video_bin, + gst_element_get_pad (play->video_queue, "sink"), + "sink"); play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); if (play->colorspace == NULL) { g_warning ("could not create the 'colorspace' element, doing without"); - gst_element_add_ghost_pad (play->video_bin, - gst_element_get_pad (play->video_sink, "sink"), - "sink"); + gst_element_connect (play->video_queue, play->video_sink); } else { gst_bin_add (GST_BIN (play->video_bin), play->colorspace); - gst_element_connect_pads (play->colorspace, "src", play->video_sink, "sink"); - gst_element_add_ghost_pad (play->video_bin, - gst_element_get_pad (play->colorspace, "sink"), - "sink"); - } - play->volume = gst_element_factory_make ("volume", "volume"); - - /* add those elements and connect them */ - gst_bin_add (GST_BIN (play->pipeline), play->source); - - if (play->audio_sink) - { - if (play->volume) - { - gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); - gst_element_connect (play->volume, play->audio_sink); - } - - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); + gst_element_connect_many (play->video_queue, play->colorspace, play->video_sink, NULL); } + gst_bin_add (GST_BIN (play->pipeline), play->video_bin); - if (play->video_bin) - { - gst_bin_add (GST_BIN (play->pipeline), play->video_bin); - } - gst_bin_use_clock (GST_BIN (play->pipeline), gst_system_clock_obtain ()); return play; @@ -395,11 +392,11 @@ if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); - gst_bin_remove (GST_BIN (play->pipeline), play->audio_sink); + gst_bin_remove (GST_BIN (play->audio_bin), play->audio_sink); } play->audio_sink = element; - gst_bin_add (GST_BIN (play->pipeline), play->audio_sink); + gst_bin_add (GST_BIN (play->audio_bin), play->audio_sink); gst_element_connect (play->volume, play->audio_sink); } @@ -432,12 +429,8 @@ if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ - if (play->audio_sink){ - gst_element_disconnect (play->autoplugger, play->audio_sink); - } - if (play->video_bin){ - gst_element_disconnect (play->autoplugger, play->video_bin); - } + gst_element_disconnect (play->autoplugger, play->audio_bin); + gst_element_disconnect (play->autoplugger, play->video_bin); gst_element_disconnect (play->autoplugger, play->source); gst_bin_remove (GST_BIN (play->pipeline), play->autoplugger); } @@ -450,17 +443,8 @@ gst_bin_add (GST_BIN (play->pipeline), play->autoplugger); gst_element_connect (play->source, play->autoplugger); - - if (play->volume) - { - gst_element_connect (play->autoplugger, play->volume); - } - - if (play->video_bin) - { - gst_element_connect (play->autoplugger, play->video_bin); - } - + gst_element_connect (play->autoplugger, play->audio_bin); + gst_element_connect (play->autoplugger, play->video_bin); return TRUE; } |
From: Steve B. <sb...@us...> - 2002-06-02 08:38:54
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sun Jun 02 2002 01:38:54 PDT Log message: fix possible crash when colorspace doesn't exist Modified files: libs/gst/play : play.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- play.c 1 Jun 2002 13:57:19 -0000 1.3 +++ play.c 2 Jun 2002 08:38:41 -0000 1.4 @@ -341,6 +341,8 @@ void gst_play_set_video_sink (GstPlay *play, GstElement *element) { + GstElement *video_mate; + g_return_if_fail (GST_IS_PLAY (play)); g_return_if_fail (GST_IS_ELEMENT (element)); @@ -349,36 +351,21 @@ if (play->colorspace){ g_print("reattach to colorspace\n"); - if (play->video_sink){ - gst_element_disconnect (play->colorspace, play->video_sink); - gst_bin_remove (GST_BIN (play->video_bin), play->video_sink); - } - play->video_sink = element; - gst_bin_add (GST_BIN (play->video_bin), play->video_sink); - gst_element_connect (play->colorspace, play->video_sink); - - return; + video_mate = play->colorspace; } - - g_print("reattach to video_bin\n"); - if (play->autoplugger){ - gst_element_disconnect (play->autoplugger, play->video_bin); + else { + g_print("reattach to video_queue\n"); + video_mate = play->video_queue; } - if (play->video_sink) - { - gst_element_remove_ghost_pad (play->video_bin, gst_element_get_pad (play->video_sink, "sink")); + if (play->video_sink){ + gst_element_disconnect (video_mate, play->video_sink); gst_bin_remove (GST_BIN (play->video_bin), play->video_sink); } - play->video_sink = element; gst_bin_add (GST_BIN (play->video_bin), play->video_sink); - gst_element_add_ghost_pad (play->video_bin, - gst_element_get_pad (play->video_sink, "sink"), - "sink"); - if (play->autoplugger){ - gst_element_connect (play->autoplugger, play->video_bin); - } + gst_element_connect (video_mate, play->video_sink); + } void |
From: Steve B. <sb...@us...> - 2002-06-05 12:47:18
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Wed Jun 05 2002 05:47:17 PDT Log message: stick an identity in between the autoplugger and the ghost pad, which works around an obsucre ghosting problem. add some debug prints while the state change problems exist Modified files: libs/gst/play : play.c play.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- play.c 3 Jun 2002 16:10:16 -0000 1.5 +++ play.c 5 Jun 2002 12:47:04 -0000 1.6 @@ -187,6 +187,14 @@ g_return_val_if_fail (play->source != NULL, NULL); gst_bin_add (GST_BIN (play->work_thread), play->source); + play->auto_identity = gst_element_factory_make ("identity", "auto_identity"); + g_return_val_if_fail (play->auto_identity != NULL, NULL); + + gst_bin_add (GST_BIN (play->work_thread), play->auto_identity); + gst_element_add_ghost_pad (play->work_thread, + gst_element_get_pad (play->auto_identity, "src"), + "src"); + /* create audio elements */ play->volume = gst_element_factory_make ("volume", "volume"); @@ -230,6 +238,7 @@ gst_element_connect_many (play->video_queue, play->colorspace, play->video_sink, NULL); } + gst_element_connect (play->work_thread, play->video_queue); gst_bin_use_clock (GST_BIN (play->pipeline), gst_system_clock_obtain ()); return play; @@ -259,6 +268,8 @@ g_assert (GST_IS_PLAY (play)); g_assert (element == GST_ELEMENT (play->pipeline)); + g_print ("got state change %d to %d\n", old, state); + /* do additional stuff depending on state */ if (GST_IS_PIPELINE (play->pipeline)){ switch (state) @@ -349,7 +360,7 @@ g_return_if_fail (GST_IS_ELEMENT (element)); g_print("overriding default video\n"); - gst_play_set_state (play, GST_STATE_NULL); + gst_play_set_state (play, GST_STATE_PAUSED); if (play->colorspace){ g_print("reattach to colorspace\n"); @@ -377,7 +388,7 @@ g_return_if_fail (GST_IS_ELEMENT (element)); g_print("overriding default audio\n"); - gst_play_set_state (play, GST_STATE_NULL); + gst_play_set_state (play, GST_STATE_PAUSED); if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); @@ -414,14 +425,18 @@ g_return_val_if_fail (GST_IS_PLAY (play), FALSE); g_return_val_if_fail (location != NULL, FALSE); - gst_play_set_state (play, GST_STATE_NULL); + if (gst_play_get_state (play) == GST_STATE_PLAYING){ + gst_play_set_state (play, GST_STATE_PAUSED); + /*gst_element_wait_state_change (play->pipeline);*/ + } + + g_print("replacing autoplugger\n"); if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, play->audio_bin); - gst_element_disconnect (play->work_thread, play->video_queue); gst_element_disconnect (play->autoplugger, play->source); - gst_element_remove_ghost_pad (play->work_thread, gst_element_get_pad (play->autoplugger, "src_2")); + gst_element_disconnect (play->autoplugger, play->auto_identity); gst_bin_remove (GST_BIN (play->work_thread), play->autoplugger); } @@ -435,12 +450,8 @@ gst_bin_add (GST_BIN (play->work_thread), play->autoplugger); gst_element_connect (play->source, play->autoplugger); gst_element_connect (play->autoplugger, play->audio_bin); + gst_element_connect (play->autoplugger, play->auto_identity); - gst_element_add_ghost_pad (play->work_thread, - gst_element_get_pad (play->autoplugger, "src_2"), - "src"); - - gst_element_connect (play->work_thread, play->video_queue); return TRUE; } Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- play.h 3 Jun 2002 16:10:16 -0000 1.3 +++ play.h 5 Jun 2002 12:47:04 -0000 1.4 @@ -44,6 +44,7 @@ GstElement *pipeline; GstElement *work_thread; GstElement *autoplugger; + GstElement *auto_identity; GstElement *video_queue; GstElement *colorspace; GstElement *video_sink; |
From: Steve B. <sb...@us...> - 2002-06-07 19:53:50
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Fri Jun 07 2002 12:53:49 PDT Log message: an indication of where things are going. the lib can now use different pipelines based on the specific use. this is handy for trying out different pipelines without screwing the code every time. current pipelines are the standard video-with-videosink-in-the-root-pipeline, and a simple threaded audio only pipeline. Modified files: libs/gst/play : play.c play.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.6&r2=1.7 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- play.c 5 Jun 2002 12:47:04 -0000 1.6 +++ play.c 7 Jun 2002 19:53:37 -0000 1.7 @@ -9,7 +9,7 @@ STREAM_END, INFORMATION, STATE_CHANGE, - LAST_SIGNAL + LAST_SIGNAL, }; enum @@ -38,6 +38,8 @@ GParamSpec *param, GstPlay *play); static void callback_audio_sink_eos (GstElement *element, GstPlay *play); +static void callback_audio_bin_iterate (GstBin *bin, GstPlay *play); + gboolean gst_play_idle_callback (GstPlay *play); static GstElementClass * parent_class = NULL; @@ -150,49 +152,107 @@ play->pipeline = NULL; play->source = NULL; play->autoplugger = NULL; - play->audio_bin = NULL; - play->audio_queue = NULL; play->audio_sink = NULL; - play->video_queue = NULL; play->colorspace = NULL; play->video_sink = NULL; play->volume = NULL; + play->other_elements = g_hash_table_new(g_str_hash, g_str_equal); + +} + +static gboolean +gst_play_audiot_setup (GstPlay *play) +{ + GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; + + play->pipeline = gst_thread_new ("main_pipeline"); + g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); +/* + play->pipeline = gst_pipeline_new ("main_pipeline"); + g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); +*/ + /* create source element */ + play->source = gst_element_factory_make ("filesrc", "source"); + g_return_val_if_fail (play->source != NULL, FALSE); + gst_bin_add (GST_BIN (play->pipeline), play->source); + + /* create audio elements */ + play->volume = gst_element_factory_make ("volume", "volume"); + play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); + g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + g_signal_connect (G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); + gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); + gst_element_connect (play->volume, play->audio_sink); + + g_signal_connect(GST_BIN (play->pipeline), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); + + return TRUE; } -GstPlay * -gst_play_new (void) +static gboolean +gst_play_audiot_set_audio (GstPlay *play, GstElement *audio_sink) { - GstPlay *play; + if (play->audio_sink) + { + gst_element_disconnect (play->volume, play->audio_sink); + gst_bin_remove (GST_BIN (play->pipeline), play->audio_sink); + } - play = g_object_new (GST_TYPE_PLAY, NULL); + play->audio_sink = audio_sink; + gst_bin_add (GST_BIN (play->pipeline), play->audio_sink); + gst_element_connect (play->volume, play->audio_sink); - /* init pipeline */ + return TRUE; +} + +static gboolean +gst_play_audiot_set_auto (GstPlay *play, GstElement *autoplugger){ + + if (play->autoplugger){ + /* we need to remove the existing autoplugger before creating a new one */ + gst_element_disconnect (play->autoplugger, play->volume); + gst_element_disconnect (play->autoplugger, play->source); + gst_bin_remove (GST_BIN (play->pipeline), play->autoplugger); + } + play->autoplugger = autoplugger; + g_return_val_if_fail (play->autoplugger != NULL, FALSE); + + gst_bin_add (GST_BIN (play->pipeline), play->autoplugger); + gst_element_connect (play->source, play->autoplugger); + gst_element_connect (play->autoplugger, play->volume); + return TRUE; +} + +static gboolean +gst_play_videots_setup (GstPlay *play) +{ + GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; + play->pipeline = gst_pipeline_new ("main_pipeline"); - g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), NULL); + g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); - play->work_thread = gst_thread_new ("work_thread"); - g_return_val_if_fail (GST_IS_THREAD (play->work_thread), NULL); + work_thread = gst_thread_new ("work_thread"); + g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); + g_hash_table_insert(play->other_elements, "work_thread", work_thread); - gst_bin_add (GST_BIN (play->pipeline), play->work_thread); - - /* connect to pipeline events */ - g_signal_connect (G_OBJECT (play->pipeline), "deep_notify", G_CALLBACK (callback_pipeline_deep_notify), play); - g_signal_connect (G_OBJECT (play->pipeline), "state_change", G_CALLBACK (callback_pipeline_state_change), play); + gst_bin_add (GST_BIN (play->pipeline), work_thread); /* create source element */ play->source = gst_element_factory_make ("filesrc", "source"); - g_return_val_if_fail (play->source != NULL, NULL); - gst_bin_add (GST_BIN (play->work_thread), play->source); + g_return_val_if_fail (play->source != NULL, FALSE); + gst_bin_add (GST_BIN (work_thread), play->source); - play->auto_identity = gst_element_factory_make ("identity", "auto_identity"); - g_return_val_if_fail (play->auto_identity != NULL, NULL); + auto_identity = gst_element_factory_make ("identity", "auto_identity"); + g_return_val_if_fail (auto_identity != NULL, FALSE); + g_hash_table_insert(play->other_elements, "auto_identity", auto_identity); - gst_bin_add (GST_BIN (play->work_thread), play->auto_identity); - gst_element_add_ghost_pad (play->work_thread, - gst_element_get_pad (play->auto_identity, "src"), + gst_bin_add (GST_BIN (work_thread), auto_identity); + gst_element_add_ghost_pad (work_thread, + gst_element_get_pad (auto_identity, "src"), "src"); /* create audio elements */ @@ -203,43 +263,165 @@ g_signal_connect (G_OBJECT (play->audio_sink), "eos", G_CALLBACK (callback_audio_sink_eos), play); - play->audio_queue = gst_element_factory_make ("queue", "audio_queue"); + audio_queue = gst_element_factory_make ("queue", "audio_queue"); + g_return_val_if_fail (audio_queue != NULL, FALSE); + g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); - play->audio_bin = gst_thread_new ("audio_bin"); - g_return_val_if_fail (play->audio_bin != NULL, NULL); + audio_bin = gst_thread_new ("audio_bin"); + g_return_val_if_fail (audio_bin != NULL, FALSE); + g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); - gst_bin_add_many (GST_BIN (play->audio_bin), play->audio_queue, play->volume, play->audio_sink, NULL); - gst_element_connect_many (play->audio_queue, play->volume, play->audio_sink, NULL); - gst_element_add_ghost_pad (play->audio_bin, - gst_element_get_pad (play->audio_queue, "sink"), + gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); + gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); + gst_element_add_ghost_pad (audio_bin, + gst_element_get_pad (audio_queue, "sink"), "sink"); - gst_bin_add (GST_BIN (play->work_thread), play->audio_bin); + gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ play->video_sink = gst_element_factory_make ("videosink", "show"); - g_return_val_if_fail (play->video_sink != NULL, NULL); + g_return_val_if_fail (play->video_sink != NULL, FALSE); - play->video_queue = gst_element_factory_make ("queue", "video_queue"); - g_object_set (G_OBJECT (play->video_queue), "block_timeout", 1000, NULL); + video_queue = gst_element_factory_make ("queue", "video_queue"); + g_return_val_if_fail (video_queue != NULL, FALSE); + g_hash_table_insert(play->other_elements, "video_queue", video_queue); + g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); - gst_bin_add_many (GST_BIN (play->pipeline), play->video_queue, play->video_sink, NULL); + gst_bin_add_many (GST_BIN (play->pipeline), video_queue, play->video_sink, NULL); play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); if (play->colorspace == NULL) { g_warning ("could not create the 'colorspace' element, doing without"); - gst_element_connect (play->video_queue, play->video_sink); + gst_element_connect (video_queue, play->video_sink); } else { gst_bin_add (GST_BIN (play->pipeline), play->colorspace); - gst_element_connect_many (play->video_queue, play->colorspace, play->video_sink, NULL); + gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); } - gst_element_connect (play->work_thread, play->video_queue); - gst_bin_use_clock (GST_BIN (play->pipeline), gst_system_clock_obtain ()); + gst_element_connect (work_thread, video_queue); + + return TRUE; +} + +static gboolean +gst_play_videots_set_auto (GstPlay *play, GstElement *autoplugger){ + + GstElement *audio_bin, *auto_identity, *work_thread; + + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); + auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); + work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); + + if (play->autoplugger){ + /* we need to remove the existing autoplugger before creating a new one */ + gst_element_disconnect (play->autoplugger, audio_bin); + gst_element_disconnect (play->autoplugger, play->source); + gst_element_disconnect (play->autoplugger, auto_identity); + + gst_bin_remove (GST_BIN (work_thread), play->autoplugger); + } + + play->autoplugger = autoplugger; + g_return_val_if_fail (play->autoplugger != NULL, FALSE); + + gst_bin_add (GST_BIN (work_thread), play->autoplugger); + gst_element_connect (play->source, play->autoplugger); + gst_element_connect (play->autoplugger, audio_bin); + gst_element_connect (play->autoplugger, auto_identity); + + return TRUE; +} + +static gboolean +gst_play_videots_set_video (GstPlay *play, GstElement *video_sink) +{ + GstElement *video_mate; + if (play->colorspace){ + g_print("reattach to colorspace\n"); + video_mate = play->colorspace; + } + else { + g_print("reattach to video_queue\n"); + video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); + } + + if (play->video_sink){ + gst_element_disconnect (video_mate, play->video_sink); + gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); + } + play->video_sink = video_sink; + gst_bin_add (GST_BIN (play->pipeline), play->video_sink); + gst_element_connect (video_mate, play->video_sink); + + return TRUE; +} + +static gboolean +gst_play_videots_set_audio (GstPlay *play, GstElement *audio_sink) +{ + GstElement *audio_bin; + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); + + if (play->audio_sink) + { + gst_element_disconnect (play->volume, play->audio_sink); + gst_bin_remove (GST_BIN (audio_bin), play->audio_sink); + } + + play->audio_sink = audio_sink; + gst_bin_add (GST_BIN (audio_bin), play->audio_sink); + gst_element_connect (play->volume, play->audio_sink); + + return TRUE; +} + +GstPlay * +gst_play_new (GstPlayPipeType pipe_type) +{ + GstPlay *play; + + play = g_object_new (GST_TYPE_PLAY, NULL); + + switch (pipe_type){ + case GST_PLAY_PIPE_VIDEO_THREADSAFE: + play->setup_pipeline = gst_play_videots_setup; + play->teardown_pipeline = NULL; + play->set_autoplugger = gst_play_videots_set_auto; + play->set_video_sink = gst_play_videots_set_video; + play->set_audio_sink = gst_play_videots_set_audio; + break; + case GST_PLAY_PIPE_AUDIO_THREADED: + play->setup_pipeline = gst_play_audiot_setup; + play->teardown_pipeline = NULL; + play->set_autoplugger = gst_play_audiot_set_auto; + play->set_video_sink = NULL; + play->set_audio_sink = gst_play_audiot_set_audio; + break; + default: + g_warning("unknown pipeline type: %d\n", pipe_type); + } + + /* init pipeline */ + if (play->setup_pipeline){ + if (! play->setup_pipeline(play)){ + g_warning ("couldn't init pipelie\n"); + return NULL; + } + } + + + if (play->pipeline){ + /* connect to pipeline events */ + g_signal_connect (G_OBJECT (play->pipeline), "deep_notify", G_CALLBACK (callback_pipeline_deep_notify), play); + g_signal_connect (G_OBJECT (play->pipeline), "state_change", G_CALLBACK (callback_pipeline_state_change), play); + + gst_bin_use_clock (GST_BIN (play->pipeline), gst_system_clock_obtain ()); + } return play; } @@ -264,9 +446,9 @@ callback_pipeline_state_change (GstElement *element, GstElementState old, GstElementState state, GstPlay* play) { - g_assert (GST_IS_ELEMENT (element)); - g_assert (GST_IS_PLAY (play)); - g_assert (element == GST_ELEMENT (play->pipeline)); + g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (GST_IS_PLAY (play)); + g_return_if_fail (element == play->pipeline); g_print ("got state change %d to %d\n", old, state); @@ -291,6 +473,12 @@ g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_END], 0); } +static void +callback_audio_bin_iterate (GstBin *bin, GstPlay *play) +{ + g_print("yo\n"); +} + gboolean gst_play_idle_callback (GstPlay *play) { @@ -351,53 +539,44 @@ } } -void -gst_play_set_video_sink (GstPlay *play, GstElement *element) +gboolean +gst_play_set_video_sink (GstPlay *play, GstElement *video_sink) { GstElement *video_mate; g_return_if_fail (GST_IS_PLAY (play)); - g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (GST_IS_ELEMENT (video_sink)); g_print("overriding default video\n"); - gst_play_set_state (play, GST_STATE_PAUSED); - - if (play->colorspace){ - g_print("reattach to colorspace\n"); - video_mate = play->colorspace; - } - else { - g_print("reattach to video_queue\n"); - video_mate = play->video_queue; + if (gst_play_get_state (play) == GST_STATE_PLAYING){ + gst_play_set_state (play, GST_STATE_READY); } - if (play->video_sink){ - gst_element_disconnect (video_mate, play->video_sink); - gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); + if (play->set_video_sink){ + return play->set_video_sink(play, video_sink); } - play->video_sink = element; - gst_bin_add (GST_BIN (play->pipeline), play->video_sink); - gst_element_connect (video_mate, play->video_sink); - + + /* if there is no set_video_sink func, fail quietly */ + return FALSE; } -void -gst_play_set_audio_sink (GstPlay *play, GstElement *element) +gboolean +gst_play_set_audio_sink (GstPlay *play, GstElement *audio_sink) { g_return_if_fail (GST_IS_PLAY (play)); - g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (GST_IS_ELEMENT (audio_sink)); g_print("overriding default audio\n"); - gst_play_set_state (play, GST_STATE_PAUSED); - if (play->audio_sink) - { - gst_element_disconnect (play->volume, play->audio_sink); - gst_bin_remove (GST_BIN (play->audio_bin), play->audio_sink); + if (gst_play_get_state (play) == GST_STATE_PLAYING){ + gst_play_set_state (play, GST_STATE_READY); } - play->audio_sink = element; - gst_bin_add (GST_BIN (play->audio_bin), play->audio_sink); - gst_element_connect (play->volume, play->audio_sink); + if (play->set_audio_sink){ + return play->set_audio_sink(play, audio_sink); + } + + /* if there is no set_audio_sink func, fail quietly */ + return FALSE; } gint @@ -407,50 +586,41 @@ g_return_val_if_fail (GST_IS_ELEMENT(play->pipeline), GST_STATE_FAILURE); g_print("setting state to %d\n", state); - return gst_element_set_state( GST_ELEMENT(play->pipeline), state); + return gst_element_set_state(play->pipeline, state); } GstElementState gst_play_get_state (GstPlay *play) { g_return_val_if_fail (GST_IS_PLAY (play), GST_STATE_FAILURE); - g_return_val_if_fail (GST_IS_ELEMENT(play->pipeline), GST_STATE_FAILURE); + g_return_val_if_fail (play->pipeline, GST_STATE_FAILURE); - return gst_element_get_state( GST_ELEMENT(play->pipeline)); + return gst_element_get_state(play->pipeline); } gboolean gst_play_set_location (GstPlay *play, const gchar *location) { + GstElementState current_state; g_return_val_if_fail (GST_IS_PLAY (play), FALSE); g_return_val_if_fail (location != NULL, FALSE); - if (gst_play_get_state (play) == GST_STATE_PLAYING){ - gst_play_set_state (play, GST_STATE_PAUSED); - /*gst_element_wait_state_change (play->pipeline);*/ + current_state = gst_play_get_state (play); + if (current_state != GST_STATE_READY){ + gst_play_set_state (play, GST_STATE_READY); } g_print("replacing autoplugger\n"); - - if (play->autoplugger){ - /* we need to remove the existing autoplugger before creating a new one */ - gst_element_disconnect (play->autoplugger, play->audio_bin); - gst_element_disconnect (play->autoplugger, play->source); - gst_element_disconnect (play->autoplugger, play->auto_identity); - - gst_bin_remove (GST_BIN (play->work_thread), play->autoplugger); - } - g_object_set (G_OBJECT (play->source), "location", location, NULL); - /* FIXME check for valid location (somehow) */ - - play->autoplugger = gst_element_factory_make ("spider", "autoplugger"); - g_return_val_if_fail (play->autoplugger != NULL, FALSE); + if (play->set_autoplugger){ + if (! play->set_autoplugger(play, gst_element_factory_make ("spider", "autoplugger"))){ + g_warning ("couldn't replace autoplugger\n"); + return FALSE; + } + } - gst_bin_add (GST_BIN (play->work_thread), play->autoplugger); - gst_element_connect (play->source, play->autoplugger); - gst_element_connect (play->autoplugger, play->audio_bin); - gst_element_connect (play->autoplugger, play->auto_identity); + /* FIXME check for valid location (somehow) */ + g_object_set (G_OBJECT (play->source), "location", location, NULL); return TRUE; } Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- play.h 5 Jun 2002 12:47:04 -0000 1.4 +++ play.h 7 Jun 2002 19:53:37 -0000 1.5 @@ -21,6 +21,13 @@ GST_PLAY_ERROR, } GstPlayReturn; +typedef enum { + GST_PLAY_PIPE_AUDIO, + GST_PLAY_PIPE_AUDIO_THREADED, + GST_PLAY_PIPE_VIDEO_THREADSAFE, + GST_PLAY_PIPE_VIDEO, +} GstPlayPipeType; + #define GST_TYPE_PLAY (gst_play_get_type()) #define GST_PLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY, GstPlay)) #define GST_PLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY, GstPlayClass)) @@ -28,31 +35,29 @@ #define GST_IS_PLAY_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY)) #define GST_PLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PLAY, GstPlayClass)) -/* Enumerations that need a GType because they're arguments */ -/* FIXME: This shouldn't go here but it is supposed to break anyway if someone - implements this in the core */ -// #define GST_TYPE_ELEMENT_STATE (gst_element_state_get_type()) - -typedef struct _GstPlayInfo GstPlayInfo; -typedef struct _GstPlay GstPlay; -typedef struct _GstPlayClass GstPlayClass; +typedef struct _GstPlay GstPlay; +typedef struct _GstPlayClass GstPlayClass; struct _GstPlay { GObject parent; - + + gboolean (*setup_pipeline) (GstPlay *play); + void (*teardown_pipeline) (GstPlay *play); + gboolean (*set_autoplugger) (GstPlay *play, GstElement *autoplugger); + gboolean (*set_video_sink) (GstPlay *play, GstElement *videosink); + gboolean (*set_audio_sink) (GstPlay *play, GstElement *audiosink); + + /* core elements */ GstElement *pipeline; - GstElement *work_thread; + GstElement *volume; + GstElement *source; GstElement *autoplugger; - GstElement *auto_identity; - GstElement *video_queue; - GstElement *colorspace; GstElement *video_sink; - GstElement *audio_bin; - GstElement *audio_queue; GstElement *audio_sink; - GstElement *volume; - GstElement *source; + GstElement *colorspace; + + GHashTable *other_elements; }; struct _GstPlayClass @@ -67,10 +72,10 @@ GType gst_play_get_type (void); -GstPlay* gst_play_new (void); +GstPlay* gst_play_new (GstPlayPipeType pipe_type); -void gst_play_set_video_sink (GstPlay *play, GstElement *element); -void gst_play_set_audio_sink (GstPlay *play, GstElement *element); +gboolean gst_play_set_video_sink (GstPlay *play, GstElement *element); +gboolean gst_play_set_audio_sink (GstPlay *play, GstElement *element); gint gst_play_set_state (GstPlay *play, GstElementState state); GstElementState gst_play_get_state (GstPlay *play); |
From: Steve B. <sb...@us...> - 2002-06-09 13:15:29
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sun Jun 09 2002 06:15:28 PDT Log message: split pipeline creation code to a seperate file. seeking basically works now Modified files: libs/gst/play : play.c play.h Added files: libs/gst/play : playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.7&r2=1.8 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- play.c 7 Jun 2002 19:53:37 -0000 1.7 +++ play.c 9 Jun 2002 13:15:15 -0000 1.8 @@ -1,14 +1,11 @@ #include "play.h" -/* This is a 1:1 copy from gst/gstpropsprivate. - * It is needed to parse INFO_EVENTs. - * - * In case you are wondering: - * This is probably a bug and needs a big FIXME - */ + enum { STREAM_END, INFORMATION, STATE_CHANGE, + STREAM_LENGTH, + TIME_TICK, LAST_SIGNAL, }; @@ -31,7 +28,6 @@ const GValue *value, GParamSpec *pspec); static void gst_play_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - static void callback_pipeline_state_change (GstElement *element, GstElementState old, GstElementState state, GstPlay *play); static void callback_pipeline_deep_notify (GstElement *element, GstElement *orig, @@ -42,6 +38,9 @@ gboolean gst_play_idle_callback (GstPlay *play); +/* split static pipeline functions to a seperate file */ +#include "playpipelines.c" + static GstElementClass * parent_class = NULL; /*static GType @@ -140,6 +139,26 @@ NULL, NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0); + + gst_play_signals [TIME_TICK] = + g_signal_new ("time_tick", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstPlayClass, time_tick), + NULL, NULL, + gst_marshal_VOID__INT64, + G_TYPE_NONE, 1, + G_TYPE_INT64); + + gst_play_signals [STREAM_LENGTH] = + g_signal_new ("stream_length", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstPlayClass, stream_length), + NULL, NULL, + gst_marshal_VOID__INT64, + G_TYPE_NONE, 1, + G_TYPE_INT64); } @@ -160,226 +179,6 @@ } -static gboolean -gst_play_audiot_setup (GstPlay *play) -{ - GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; - - play->pipeline = gst_thread_new ("main_pipeline"); - g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); -/* - play->pipeline = gst_pipeline_new ("main_pipeline"); - g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); -*/ - /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); - g_return_val_if_fail (play->source != NULL, FALSE); - gst_bin_add (GST_BIN (play->pipeline), play->source); - - /* create audio elements */ - play->volume = gst_element_factory_make ("volume", "volume"); - - play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); - - gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); - gst_element_connect (play->volume, play->audio_sink); - - g_signal_connect(GST_BIN (play->pipeline), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); - - return TRUE; -} - -static gboolean -gst_play_audiot_set_audio (GstPlay *play, GstElement *audio_sink) -{ - if (play->audio_sink) - { - gst_element_disconnect (play->volume, play->audio_sink); - gst_bin_remove (GST_BIN (play->pipeline), play->audio_sink); - } - - play->audio_sink = audio_sink; - gst_bin_add (GST_BIN (play->pipeline), play->audio_sink); - gst_element_connect (play->volume, play->audio_sink); - - return TRUE; -} - -static gboolean -gst_play_audiot_set_auto (GstPlay *play, GstElement *autoplugger){ - - if (play->autoplugger){ - /* we need to remove the existing autoplugger before creating a new one */ - gst_element_disconnect (play->autoplugger, play->volume); - gst_element_disconnect (play->autoplugger, play->source); - gst_bin_remove (GST_BIN (play->pipeline), play->autoplugger); - } - - play->autoplugger = autoplugger; - g_return_val_if_fail (play->autoplugger != NULL, FALSE); - - gst_bin_add (GST_BIN (play->pipeline), play->autoplugger); - gst_element_connect (play->source, play->autoplugger); - gst_element_connect (play->autoplugger, play->volume); - return TRUE; -} - -static gboolean -gst_play_videots_setup (GstPlay *play) -{ - GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; - - play->pipeline = gst_pipeline_new ("main_pipeline"); - g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); - - work_thread = gst_thread_new ("work_thread"); - g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); - g_hash_table_insert(play->other_elements, "work_thread", work_thread); - - gst_bin_add (GST_BIN (play->pipeline), work_thread); - - /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); - g_return_val_if_fail (play->source != NULL, FALSE); - gst_bin_add (GST_BIN (work_thread), play->source); - - auto_identity = gst_element_factory_make ("identity", "auto_identity"); - g_return_val_if_fail (auto_identity != NULL, FALSE); - g_hash_table_insert(play->other_elements, "auto_identity", auto_identity); - - gst_bin_add (GST_BIN (work_thread), auto_identity); - gst_element_add_ghost_pad (work_thread, - gst_element_get_pad (auto_identity, "src"), - "src"); - - /* create audio elements */ - play->volume = gst_element_factory_make ("volume", "volume"); - - play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); - - audio_queue = gst_element_factory_make ("queue", "audio_queue"); - g_return_val_if_fail (audio_queue != NULL, FALSE); - g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); - - audio_bin = gst_thread_new ("audio_bin"); - g_return_val_if_fail (audio_bin != NULL, FALSE); - g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); - - gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); - gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); - gst_element_add_ghost_pad (audio_bin, - gst_element_get_pad (audio_queue, "sink"), - "sink"); - - gst_bin_add (GST_BIN (work_thread), audio_bin); - - /* create video elements */ - play->video_sink = gst_element_factory_make ("videosink", "show"); - - g_return_val_if_fail (play->video_sink != NULL, FALSE); - - video_queue = gst_element_factory_make ("queue", "video_queue"); - g_return_val_if_fail (video_queue != NULL, FALSE); - g_hash_table_insert(play->other_elements, "video_queue", video_queue); - g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); - - gst_bin_add_many (GST_BIN (play->pipeline), video_queue, play->video_sink, NULL); - - play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); - if (play->colorspace == NULL) - { - g_warning ("could not create the 'colorspace' element, doing without"); - gst_element_connect (video_queue, play->video_sink); - } - else - { - gst_bin_add (GST_BIN (play->pipeline), play->colorspace); - gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); - } - - gst_element_connect (work_thread, video_queue); - - return TRUE; -} - -static gboolean -gst_play_videots_set_auto (GstPlay *play, GstElement *autoplugger){ - - GstElement *audio_bin, *auto_identity, *work_thread; - - audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); - auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); - work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); - - if (play->autoplugger){ - /* we need to remove the existing autoplugger before creating a new one */ - gst_element_disconnect (play->autoplugger, audio_bin); - gst_element_disconnect (play->autoplugger, play->source); - gst_element_disconnect (play->autoplugger, auto_identity); - - gst_bin_remove (GST_BIN (work_thread), play->autoplugger); - } - - play->autoplugger = autoplugger; - g_return_val_if_fail (play->autoplugger != NULL, FALSE); - - gst_bin_add (GST_BIN (work_thread), play->autoplugger); - gst_element_connect (play->source, play->autoplugger); - gst_element_connect (play->autoplugger, audio_bin); - gst_element_connect (play->autoplugger, auto_identity); - - return TRUE; -} - -static gboolean -gst_play_videots_set_video (GstPlay *play, GstElement *video_sink) -{ - GstElement *video_mate; - if (play->colorspace){ - g_print("reattach to colorspace\n"); - video_mate = play->colorspace; - } - else { - g_print("reattach to video_queue\n"); - video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); - } - - if (play->video_sink){ - gst_element_disconnect (video_mate, play->video_sink); - gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); - } - play->video_sink = video_sink; - gst_bin_add (GST_BIN (play->pipeline), play->video_sink); - gst_element_connect (video_mate, play->video_sink); - - return TRUE; -} - -static gboolean -gst_play_videots_set_audio (GstPlay *play, GstElement *audio_sink) -{ - GstElement *audio_bin; - audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); - - if (play->audio_sink) - { - gst_element_disconnect (play->volume, play->audio_sink); - gst_bin_remove (GST_BIN (audio_bin), play->audio_sink); - } - - play->audio_sink = audio_sink; - gst_bin_add (GST_BIN (audio_bin), play->audio_sink); - gst_element_connect (play->volume, play->audio_sink); - - return TRUE; -} - GstPlay * gst_play_new (GstPlayPipeType pipe_type) { @@ -402,6 +201,13 @@ play->set_video_sink = NULL; play->set_audio_sink = gst_play_audiot_set_audio; break; + case GST_PLAY_PIPE_AUDIO_HYPER_THREADED: + play->setup_pipeline = gst_play_audioht_setup; + play->teardown_pipeline = NULL; + play->set_autoplugger = gst_play_audioht_set_auto; + play->set_video_sink = NULL; + play->set_audio_sink = gst_play_audioht_set_audio; + break; default: g_warning("unknown pipeline type: %d\n", pipe_type); } @@ -420,7 +226,8 @@ g_signal_connect (G_OBJECT (play->pipeline), "deep_notify", G_CALLBACK (callback_pipeline_deep_notify), play); g_signal_connect (G_OBJECT (play->pipeline), "state_change", G_CALLBACK (callback_pipeline_state_change), play); - gst_bin_use_clock (GST_BIN (play->pipeline), gst_system_clock_obtain ()); + play->clock = gst_system_clock_obtain(); + gst_bin_use_clock (GST_BIN (play->pipeline), play->clock); } return play; @@ -476,7 +283,34 @@ static void callback_audio_bin_iterate (GstBin *bin, GstPlay *play) { - g_print("yo\n"); + gint secs; + play->time_nanos = gst_clock_get_time(play->clock); + secs = (gint) (play->time_nanos / GST_SECOND); + + if (play->need_stream_length){ + gint64 value; + GstFormat format = GST_FORMAT_TIME; + gboolean query_worked; + + if (play->audio_sink != NULL){ + query_worked = gst_element_query (play->audio_sink, GST_PAD_QUERY_TOTAL, &format, &value); + } + else if (play->video_sink != NULL){ + query_worked = gst_element_query (play->video_sink, GST_PAD_QUERY_TOTAL, &format, &value); + } + if (query_worked){ + g_print("got length %lld\n", value); + g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_LENGTH], 0, value); + play->length_nanos = value; + play->need_stream_length = FALSE; + } + } + + if (secs != play->time_seconds){ + play->time_seconds = secs; + g_signal_emit (G_OBJECT (play), gst_play_signals [TIME_TICK], 0, play->time_nanos); + } + } gboolean @@ -539,6 +373,45 @@ } } +void +gst_play_seek_to_time (GstPlay *play, gint64 time_nanos) +{ + GstEvent *s_event; + gboolean audio_seek_worked = FALSE; + gboolean video_seek_worked = FALSE; + + g_return_if_fail (GST_IS_PLAY (play)); + if (time_nanos < 0LL){ + play->seek_time = 0LL; + } + else if (time_nanos < 0LL){ + play->seek_time = play->length_nanos; + } + else { + play->seek_time = time_nanos; + } + + g_print("doing seek to %lld\n", play->seek_time); + gst_element_set_state(play->pipeline, GST_STATE_PAUSED); + + s_event = gst_event_new_seek (GST_FORMAT_TIME | + GST_SEEK_METHOD_SET | + GST_SEEK_FLAG_FLUSH, play->seek_time); + if (play->audio_sink != NULL){ + audio_seek_worked = gst_element_send_event (play->audio_sink, s_event); + } + if (play->video_sink != NULL){ + video_seek_worked = gst_element_send_event (play->video_sink, s_event); + } + gst_event_free (s_event); + + if (audio_seek_worked || video_seek_worked){ + play->time_nanos = gst_clock_get_time(play->clock); + g_signal_emit (G_OBJECT (play), gst_play_signals [TIME_TICK], 0, play->time_nanos); + } + gst_element_set_state(play->pipeline, GST_STATE_PLAYING); +} + gboolean gst_play_set_video_sink (GstPlay *play, GstElement *video_sink) { @@ -621,6 +494,14 @@ /* FIXME check for valid location (somehow) */ g_object_set (G_OBJECT (play->source), "location", location, NULL); + + /* reset time/length values */ + play->time_seconds = 0; + play->length_nanos = 0LL; + play->time_nanos = 0LL; + g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_LENGTH], 0, 0LL); + g_signal_emit (G_OBJECT (play), gst_play_signals [TIME_TICK], 0, 0LL); + play->need_stream_length = TRUE; return TRUE; } Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- play.h 7 Jun 2002 19:53:37 -0000 1.5 +++ play.h 9 Jun 2002 13:15:16 -0000 1.6 @@ -24,6 +24,7 @@ typedef enum { GST_PLAY_PIPE_AUDIO, GST_PLAY_PIPE_AUDIO_THREADED, + GST_PLAY_PIPE_AUDIO_HYPER_THREADED, GST_PLAY_PIPE_VIDEO_THREADSAFE, GST_PLAY_PIPE_VIDEO, } GstPlayPipeType; @@ -58,6 +59,15 @@ GstElement *colorspace; GHashTable *other_elements; + + GstClock *clock; + + gboolean need_stream_length; + gboolean need_seek; + gint time_seconds; + gint64 seek_time; + gint64 time_nanos; + gint64 length_nanos; }; struct _GstPlayClass @@ -68,11 +78,15 @@ void (*information) (GstPlay* play, GstElement* element, gchar *name); void (*state_changed) (GstPlay* play, GstElementState old_state, GstElementState new_state); void (*stream_end) (GstPlay* play); + void (*time_tick) (GstPlay* play, gint64 time_nanos); + void (*stream_length) (GstPlay* play, gint64 length_nanos); }; GType gst_play_get_type (void); GstPlay* gst_play_new (GstPlayPipeType pipe_type); + +void gst_play_seek_to_time (GstPlay *play, gint64 time_nanos); gboolean gst_play_set_video_sink (GstPlay *play, GstElement *element); gboolean gst_play_set_audio_sink (GstPlay *play, GstElement *element); --- NEW FILE: playpipelines.c --- /* * GST_PLAY_PIPE_AUDIO_THREADED * { filesrc ! spider ! volume ! osssink } */ static gboolean gst_play_audiot_setup (GstPlay *play) { play->pipeline = gst_thread_new ("main_pipeline"); g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); /* play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); */ /* create source element */ play->source = gst_element_factory_make ("filesrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->source); /* create audio elements */ play->volume = gst_element_factory_make ("volume", "volume"); play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); g_signal_connect (G_OBJECT (play->audio_sink), "eos", G_CALLBACK (callback_audio_sink_eos), play); gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); gst_element_connect (play->volume, play->audio_sink); g_signal_connect(GST_BIN (play->pipeline), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); return TRUE; } static gboolean gst_play_audiot_set_audio (GstPlay *play, GstElement *audio_sink) { if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); gst_bin_remove (GST_BIN (play->pipeline), play->audio_sink); } play->audio_sink = audio_sink; gst_bin_add (GST_BIN (play->pipeline), play->audio_sink); gst_element_connect (play->volume, play->audio_sink); return TRUE; } static gboolean gst_play_audiot_set_auto (GstPlay *play, GstElement *autoplugger){ if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, play->volume); gst_element_disconnect (play->autoplugger, play->source); gst_bin_remove (GST_BIN (play->pipeline), play->autoplugger); } play->autoplugger = autoplugger; g_return_val_if_fail (play->autoplugger != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->autoplugger); gst_element_connect (play->source, play->autoplugger); gst_element_connect (play->autoplugger, play->volume); return TRUE; } /* * GST_PLAY_PIPE_AUDIO_HYPER_THREADED * { filesrc ! spider ! { queue ! volume ! osssink } } */ static gboolean gst_play_audioht_setup (GstPlay *play) { GstElement *audio_thread, *audio_queue; /* play->pipeline = gst_thread_new ("main_pipeline"); g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); */ play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); /* create source element */ play->source = gst_element_factory_make ("filesrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->source); /* create audio elements */ audio_thread = gst_thread_new ("audio_thread"); g_return_val_if_fail (GST_IS_THREAD (audio_thread), FALSE); g_hash_table_insert(play->other_elements, "audio_thread", audio_thread); audio_queue = gst_element_factory_make ("queue", "audio_queue"); g_return_val_if_fail (audio_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); play->volume = gst_element_factory_make ("volume", "volume"); play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); g_signal_connect (G_OBJECT (play->audio_sink), "eos", G_CALLBACK (callback_audio_sink_eos), play); gst_bin_add_many (GST_BIN (audio_thread), audio_queue, play->volume, play->audio_sink, NULL); gst_element_connect_many (audio_queue, play->volume, play->audio_sink); gst_element_add_ghost_pad (audio_thread, gst_element_get_pad (audio_queue, "sink"), "sink"); gst_bin_add (GST_BIN (play->pipeline), audio_thread); g_signal_connect(GST_BIN (audio_thread), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); return TRUE; } static gboolean gst_play_audioht_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_thread; audio_thread = g_hash_table_lookup(play->other_elements, "audio_thread"); if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); gst_bin_remove (GST_BIN (audio_thread), play->audio_sink); } play->audio_sink = audio_sink; gst_bin_add (GST_BIN (audio_thread), play->audio_sink); gst_element_connect (play->volume, play->audio_sink); return TRUE; } static gboolean gst_play_audioht_set_auto (GstPlay *play, GstElement *autoplugger) { GstElement *audio_thread; audio_thread = g_hash_table_lookup(play->other_elements, "audio_thread"); if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, audio_thread); gst_element_disconnect (play->autoplugger, play->source); gst_bin_remove (GST_BIN (play->pipeline), play->autoplugger); } play->autoplugger = autoplugger; g_return_val_if_fail (play->autoplugger != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->autoplugger); gst_element_connect (play->source, play->autoplugger); gst_element_connect (play->autoplugger, audio_thread); return TRUE; } /* * GST_PLAY_PIPE_VIDEO_THREADSAFE * { filesrc ! spider ! { queue ! volume ! osssink } } * spider0.src2 ! queue ! colorspace ! videosink * (note that the videosink is not contained by a thread) */ static gboolean gst_play_videots_setup (GstPlay *play) { GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); work_thread = gst_thread_new ("work_thread"); g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); g_hash_table_insert(play->other_elements, "work_thread", work_thread); gst_bin_add (GST_BIN (play->pipeline), work_thread); /* create source element */ play->source = gst_element_factory_make ("filesrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (work_thread), play->source); auto_identity = gst_element_factory_make ("identity", "auto_identity"); g_return_val_if_fail (auto_identity != NULL, FALSE); g_hash_table_insert(play->other_elements, "auto_identity", auto_identity); gst_bin_add (GST_BIN (work_thread), auto_identity); gst_element_add_ghost_pad (work_thread, gst_element_get_pad (auto_identity, "src"), "src"); /* create audio elements */ play->volume = gst_element_factory_make ("volume", "volume"); play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); g_signal_connect (G_OBJECT (play->audio_sink), "eos", G_CALLBACK (callback_audio_sink_eos), play); audio_queue = gst_element_factory_make ("queue", "audio_queue"); g_return_val_if_fail (audio_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); audio_bin = gst_thread_new ("audio_bin"); g_return_val_if_fail (audio_bin != NULL, FALSE); g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); g_signal_connect(GST_BIN (audio_bin), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); gst_element_add_ghost_pad (audio_bin, gst_element_get_pad (audio_queue, "sink"), "sink"); gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ play->video_sink = gst_element_factory_make ("videosink", "show"); g_return_val_if_fail (play->video_sink != NULL, FALSE); video_queue = gst_element_factory_make ("queue", "video_queue"); g_return_val_if_fail (video_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_queue", video_queue); g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); gst_bin_add_many (GST_BIN (play->pipeline), video_queue, play->video_sink, NULL); play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); if (play->colorspace == NULL) { g_warning ("could not create the 'colorspace' element, doing without"); gst_element_connect (video_queue, play->video_sink); } else { gst_bin_add (GST_BIN (play->pipeline), play->colorspace); gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); } gst_element_connect (work_thread, video_queue); return TRUE; } static gboolean gst_play_videots_set_auto (GstPlay *play, GstElement *autoplugger){ GstElement *audio_bin, *auto_identity, *work_thread; audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, audio_bin); gst_element_disconnect (play->autoplugger, play->source); gst_element_disconnect (play->autoplugger, auto_identity); gst_bin_remove (GST_BIN (work_thread), play->autoplugger); } play->autoplugger = autoplugger; g_return_val_if_fail (play->autoplugger != NULL, FALSE); gst_bin_add (GST_BIN (work_thread), play->autoplugger); gst_element_connect (play->source, play->autoplugger); gst_element_connect (play->autoplugger, audio_bin); gst_element_connect (play->autoplugger, auto_identity); return TRUE; } static gboolean gst_play_videots_set_video (GstPlay *play, GstElement *video_sink) { GstElement *video_mate; if (play->colorspace){ g_print("reattach to colorspace\n"); video_mate = play->colorspace; } else { g_print("reattach to video_queue\n"); video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); } if (play->video_sink){ gst_element_disconnect (video_mate, play->video_sink); gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); } play->video_sink = video_sink; gst_bin_add (GST_BIN (play->pipeline), play->video_sink); gst_element_connect (video_mate, play->video_sink); return TRUE; } static gboolean gst_play_videots_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_bin; audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); gst_bin_remove (GST_BIN (audio_bin), play->audio_sink); } play->audio_sink = audio_sink; gst_bin_add (GST_BIN (audio_bin), play->audio_sink); gst_element_connect (play->volume, play->audio_sink); return TRUE; } |
From: Steve B. <sb...@us...> - 2002-06-10 16:58:52
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Mon Jun 10 2002 09:58:51 PDT Log message: - lock bins with pre/post iterate funcs. - do all interesting stuff in timeout or idle funcs - crash less because less signals are being sent from other threads in the long term, all signals sent from this lib will have to come from the app's main thread Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.8&r2=1.9 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.6&r2=1.7 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- play.c 9 Jun 2002 13:15:15 -0000 1.8 +++ play.c 10 Jun 2002 16:58:37 -0000 1.9 @@ -34,9 +34,15 @@ GParamSpec *param, GstPlay *play); static void callback_audio_sink_eos (GstElement *element, GstPlay *play); -static void callback_audio_bin_iterate (GstBin *bin, GstPlay *play); +static void callback_audio_bin_pre_iterate (GstBin *bin, GstPlay *play); +static void callback_audio_bin_post_iterate (GstBin *bin, GstPlay *play); -gboolean gst_play_idle_callback (GstPlay *play); +static void callback_bin_pre_iterate (GstBin *bin, GMutex *mutex); +static void callback_bin_post_iterate (GstBin *bin, GMutex *mutex); + +static gboolean gst_play_idle_callback (GstPlay *play); +static gboolean gst_play_get_length_callback (GstPlay *play); +static gboolean gst_play_tick_callback (GstPlay *play); /* split static pipeline functions to a seperate file */ #include "playpipelines.c" @@ -176,6 +182,8 @@ play->video_sink = NULL; play->volume = NULL; play->other_elements = g_hash_table_new(g_str_hash, g_str_equal); + play->audio_bin_mutex = g_mutex_new(); + play->video_bin_mutex = g_mutex_new(); } @@ -238,6 +246,8 @@ { GstPlay *play = GST_PLAY (object); G_OBJECT_CLASS (parent_class)->dispose (object); + g_mutex_free(play->audio_bin_mutex); + g_mutex_free(play->video_bin_mutex); } static void @@ -265,6 +275,10 @@ { case GST_STATE_PLAYING: g_idle_add ((GSourceFunc) gst_play_idle_callback, play); + g_timeout_add (200, (GSourceFunc) gst_play_tick_callback, play); + if (play->length_nanos == 0LL){ + g_timeout_add (200, (GSourceFunc) gst_play_get_length_callback, play); + } break; default: g_idle_remove_by_data(play); @@ -274,57 +288,74 @@ g_signal_emit (G_OBJECT (play), gst_play_signals[STATE_CHANGE], 0, old, state); } +static gboolean +gst_play_idle_eos (GstPlay* play) +{ + g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_END], 0); + return FALSE; +} + static void callback_audio_sink_eos (GstElement *element, GstPlay *play) { - g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_END], 0); + g_idle_add ((GSourceFunc) gst_play_idle_eos, play); } static void -callback_audio_bin_iterate (GstBin *bin, GstPlay *play) +callback_bin_pre_iterate (GstBin *bin, GMutex *mutex) { - gint secs; - play->time_nanos = gst_clock_get_time(play->clock); - secs = (gint) (play->time_nanos / GST_SECOND); + g_mutex_lock(mutex); +} - if (play->need_stream_length){ - gint64 value; - GstFormat format = GST_FORMAT_TIME; - gboolean query_worked; - - if (play->audio_sink != NULL){ - query_worked = gst_element_query (play->audio_sink, GST_PAD_QUERY_TOTAL, &format, &value); - } - else if (play->video_sink != NULL){ - query_worked = gst_element_query (play->video_sink, GST_PAD_QUERY_TOTAL, &format, &value); - } - if (query_worked){ - g_print("got length %lld\n", value); - g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_LENGTH], 0, value); - play->length_nanos = value; - play->need_stream_length = FALSE; - } +static void +callback_bin_post_iterate (GstBin *bin, GMutex *mutex) +{ + g_mutex_unlock(mutex); +} + +static gboolean +gst_play_get_length_callback (GstPlay *play) +{ + gint64 value; + GstFormat format = GST_FORMAT_TIME; + gboolean query_worked; + + if (play->audio_sink != NULL){ + g_mutex_lock(play->audio_bin_mutex); + query_worked = gst_element_query (play->audio_sink, GST_PAD_QUERY_TOTAL, &format, &value); + g_mutex_unlock(play->audio_bin_mutex); + } + else if (play->video_sink != NULL){ + g_mutex_lock(play->video_bin_mutex); + query_worked = gst_element_query (play->video_sink, GST_PAD_QUERY_TOTAL, &format, &value); + g_mutex_unlock(play->video_bin_mutex); + } + if (query_worked){ + g_print("got length %lld\n", value); + g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_LENGTH], 0, value); + play->length_nanos = value; + return FALSE; } + return TRUE; +} +static gboolean +gst_play_tick_callback (GstPlay *play) +{ + gint secs; + play->time_nanos = gst_clock_get_time(play->clock); + secs = (gint) (play->time_nanos / GST_SECOND); if (secs != play->time_seconds){ play->time_seconds = secs; g_signal_emit (G_OBJECT (play), gst_play_signals [TIME_TICK], 0, play->time_nanos); } - + return TRUE; } -gboolean +static gboolean gst_play_idle_callback (GstPlay *play) { - gboolean ret; - - ret = gst_bin_iterate (GST_BIN (play->pipeline)); - if (!ret) - { - /* g_print("idle func removing itself\n"); */ - } - - return ret; + return gst_bin_iterate (GST_BIN (play->pipeline)); } static void Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- play.h 9 Jun 2002 13:15:16 -0000 1.6 +++ play.h 10 Jun 2002 16:58:39 -0000 1.7 @@ -62,6 +62,9 @@ GstClock *clock; + GMutex *audio_bin_mutex; + GMutex *video_bin_mutex; + gboolean need_stream_length; gboolean need_seek; gint time_seconds; Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- playpipelines.c 9 Jun 2002 13:15:16 -0000 1.1 +++ playpipelines.c 10 Jun 2002 16:58:39 -0000 1.2 @@ -28,7 +28,10 @@ gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); gst_element_connect (play->volume, play->audio_sink); - g_signal_connect(GST_BIN (play->pipeline), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); + gst_bin_set_pre_iterate_function(GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); return TRUE; } @@ -113,7 +116,10 @@ gst_bin_add (GST_BIN (play->pipeline), audio_thread); - g_signal_connect(GST_BIN (audio_thread), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); + gst_bin_set_pre_iterate_function(GST_BIN (audio_thread), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (audio_thread), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); return TRUE; } @@ -211,7 +217,10 @@ g_return_val_if_fail (audio_bin != NULL, FALSE); g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); - g_signal_connect(GST_BIN (audio_bin), "iterate_started", G_CALLBACK(callback_audio_bin_iterate), play); + gst_bin_set_pre_iterate_function(GST_BIN (audio_bin), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (audio_bin), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); @@ -244,7 +253,12 @@ gst_bin_add (GST_BIN (play->pipeline), play->colorspace); gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); } - + + gst_bin_set_pre_iterate_function(GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->video_bin_mutex); + gst_element_connect (work_thread, video_queue); return TRUE; |
From: Steve B. <sb...@us...> - 2002-06-15 13:31:29
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sat Jun 15 2002 06:31:28 PDT Log message: Is that a smooth volume control you say? Why yes, yes it is. Modified files: libs/gst/play : Makefile.am play.c play.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/Makefile.am.diff?r1=1.2&r2=1.3 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile.am 12 Jun 2002 20:43:09 -0000 1.2 +++ Makefile.am 15 Jun 2002 13:31:16 -0000 1.3 @@ -8,6 +8,6 @@ libgstplayinclude_HEADERS = play.h libgstplay_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_CFLAGS) -libgstplay_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_LIBS) +libgstplay_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_LIBS) -lgstcontrol noinst_HEADERS = playpipelines.c Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- play.c 10 Jun 2002 21:47:16 -0000 1.10 +++ play.c 15 Jun 2002 13:31:16 -0000 1.11 @@ -165,6 +165,10 @@ gst_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64); + + if (!gst_library_load ("gstcontrol")){ + g_warning("could not load gstcontrol library, volume changing won't work\n"); + } } @@ -234,7 +238,23 @@ g_signal_connect (G_OBJECT (play->pipeline), "deep_notify", G_CALLBACK (callback_pipeline_deep_notify), play); g_signal_connect (G_OBJECT (play->pipeline), "state_change", G_CALLBACK (callback_pipeline_state_change), play); } - + + if (play->volume){ + play->vol_dpman = gst_dpman_get_manager(play->volume); + play->vol_dparam = gst_dpsmooth_new(G_TYPE_FLOAT); + + g_object_set(G_OBJECT(play->vol_dparam), "update_period", 2000000LL, NULL); + + g_object_set(G_OBJECT(play->vol_dparam), "slope_delta_float", 0.1F, NULL); + g_object_set(G_OBJECT(play->vol_dparam), "slope_time", 10000000LL, NULL); + + if (!gst_dpman_attach_dparam (play->vol_dpman, "volume", play->vol_dparam)){ + g_warning("could not attach dparam to volume element\n"); + } + gst_dpman_set_mode(play->vol_dpman, "asynchronous"); + gst_play_set_volume(play, 0.9); + } + return play; } @@ -547,21 +567,21 @@ void -gst_play_set_volume (GstPlay *play, float volume) +gst_play_set_volume (GstPlay *play, gfloat volume) { g_return_if_fail (GST_IS_PLAY (play)); - g_object_set (G_OBJECT (play->volume), "volume", volume, NULL); + g_object_set(G_OBJECT(play->vol_dparam), "value_float", volume, NULL); } -float +gfloat gst_play_get_volume (GstPlay *play) { - float volume; + gfloat volume; g_return_val_if_fail (GST_IS_PLAY (play), 0); - g_object_get (G_OBJECT (play->volume), "volume", &volume, NULL); + g_object_get(G_OBJECT(play->vol_dparam), "value_float", &volume, NULL); return volume; } Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- play.h 10 Jun 2002 16:58:39 -0000 1.7 +++ play.h 15 Jun 2002 13:31:16 -0000 1.8 @@ -2,6 +2,7 @@ #define __GSTPLAY_H__ #include <gst/gst.h> +#include <gst/control/control.h> /* * GstPlay is a simple class for audio and video playback. @@ -58,6 +59,8 @@ GstElement *audio_sink; GstElement *colorspace; + GstDParamManager *vol_dpman; + GstDParam *vol_dparam; GHashTable *other_elements; GstClock *clock; @@ -100,8 +103,8 @@ gboolean gst_play_set_location (GstPlay *play, const gchar *location); gchar* gst_play_get_location (GstPlay *play); -void gst_play_set_volume (GstPlay *play, float volume); -float gst_play_get_volume (GstPlay *play); +void gst_play_set_volume (GstPlay *play, gfloat volume); +gfloat gst_play_get_volume (GstPlay *play); void gst_play_set_mute (GstPlay *play, gboolean mute); gboolean gst_play_get_mute (GstPlay *play); |
From: Steve B. <sb...@us...> - 2002-06-17 18:51:10
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Mon Jun 17 2002 11:51:07 PDT Log message: propagate the have_xid and have_size signals Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.8&r2=1.9 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- play.c 15 Jun 2002 13:31:16 -0000 1.11 +++ play.c 17 Jun 2002 18:50:55 -0000 1.12 @@ -6,6 +6,8 @@ STATE_CHANGE, STREAM_LENGTH, TIME_TICK, + HAVE_XID, + HAVE_VIDEO_SIZE, LAST_SIGNAL, }; @@ -33,6 +35,8 @@ static void callback_pipeline_deep_notify (GstElement *element, GstElement *orig, GParamSpec *param, GstPlay *play); static void callback_audio_sink_eos (GstElement *element, GstPlay *play); +static void callback_video_have_xid (GstElement *element, gint xid, GstPlay *play); +static void callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play); static void callback_audio_bin_pre_iterate (GstBin *bin, GstPlay *play); static void callback_audio_bin_post_iterate (GstBin *bin, GstPlay *play); @@ -166,6 +170,26 @@ G_TYPE_NONE, 1, G_TYPE_INT64); + gst_play_signals [HAVE_XID] = + g_signal_new ("have_xid", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstPlayClass, have_xid), + NULL, NULL, + gst_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + + gst_play_signals [HAVE_VIDEO_SIZE] = + g_signal_new ("have_video_size", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GstPlayClass, have_video_size), + NULL, NULL, + gst_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, + G_TYPE_INT, G_TYPE_INT); + if (!gst_library_load ("gstcontrol")){ g_warning("could not load gstcontrol library, volume changing won't work\n"); } @@ -297,6 +321,15 @@ g_timeout_add (200, (GSourceFunc) gst_play_get_length_callback, play); } break; + case GST_STATE_PAUSED: + /*if (old == GST_STATE_READY && play->video_sink && + g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(play->video_sink)), "xid")){ + + gint xid; + g_object_get(G_OBJECT(play->video_sink), "xid", &xid, NULL); + g_print("have xid %d\n", xid); + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, xid); + } */ default: g_idle_remove_by_data(play); break; @@ -318,6 +351,20 @@ g_idle_add ((GSourceFunc) gst_play_idle_eos, play); } +static void +callback_video_have_xid (GstElement *element, gint xid, GstPlay *play) +{ + g_print("have xid %d\n", xid); + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, xid); +} + +static void +callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play){ + + g_print("have size %d x %d\n", width, height); + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, width, height); +} + static void callback_bin_pre_iterate (GstBin *bin, GMutex *mutex) { @@ -468,6 +515,8 @@ g_return_if_fail (GST_IS_PLAY (play)); g_return_if_fail (GST_IS_ELEMENT (video_sink)); + + return TRUE; g_print("overriding default video\n"); if (gst_play_get_state (play) == GST_STATE_PLAYING){ Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- play.h 15 Jun 2002 13:31:16 -0000 1.8 +++ play.h 17 Jun 2002 18:50:55 -0000 1.9 @@ -86,6 +86,8 @@ void (*stream_end) (GstPlay* play); void (*time_tick) (GstPlay* play, gint64 time_nanos); void (*stream_length) (GstPlay* play, gint64 length_nanos); + void (*have_xid) (GstPlay* play, gint xid); + void (*have_video_size) (GstPlay* play, gint width, gint height); }; GType gst_play_get_type (void); Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- playpipelines.c 10 Jun 2002 16:58:39 -0000 1.2 +++ playpipelines.c 17 Jun 2002 18:50:55 -0000 1.3 @@ -170,8 +170,8 @@ /* * GST_PLAY_PIPE_VIDEO_THREADSAFE * { filesrc ! spider ! { queue ! volume ! osssink } } - * spider0.src2 ! queue ! colorspace ! videosink - * (note that the videosink is not contained by a thread) + * spider0.src2 ! queue ! colorspace ! xvideosink + * (note that the xvideosink is not contained by a thread) */ static gboolean gst_play_videots_setup (GstPlay *play) @@ -231,7 +231,11 @@ gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ - play->video_sink = gst_element_factory_make ("videosink", "show"); + play->video_sink = gst_element_factory_make ("xvideosink", "show"); + g_signal_connect (G_OBJECT (play->video_sink), "have_xid", + G_CALLBACK (callback_video_have_xid), play); + g_signal_connect (G_OBJECT (play->video_sink), "have_size", + G_CALLBACK (callback_video_have_size), play); g_return_val_if_fail (play->video_sink != NULL, FALSE); |
From: Steve B. <sb...@us...> - 2002-06-29 07:14:56
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sat Jun 29 2002 00:14:55 PDT Log message: added fully threaded video pipeline, let me know if it looks smoother. decoupled have_xid and have_size signals Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.15&r2=1.16 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- play.c 22 Jun 2002 13:53:05 -0000 1.15 +++ play.c 29 Jun 2002 07:14:43 -0000 1.16 @@ -202,6 +202,13 @@ play = g_object_new (GST_TYPE_PLAY, NULL); switch (pipe_type){ + case GST_PLAY_PIPE_VIDEO: + play->setup_pipeline = gst_play_video_setup; + play->teardown_pipeline = NULL; + play->set_autoplugger = gst_play_video_set_auto; + play->set_video_sink = gst_play_video_set_video; + play->set_audio_sink = gst_play_video_set_audio; + break; case GST_PLAY_PIPE_VIDEO_THREADSAFE: play->setup_pipeline = gst_play_videots_setup; play->teardown_pipeline = NULL; @@ -301,14 +308,6 @@ } break; case GST_STATE_PAUSED: - /*if (old == GST_STATE_READY && play->video_sink && - g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(play->video_sink)), "xid")){ - - gint xid; - g_object_get(G_OBJECT(play->video_sink), "xid", &xid, NULL); - g_print("have xid %d\n", xid); - g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, xid); - } */ default: g_idle_remove_by_data(play); break; @@ -331,17 +330,32 @@ } static void +gst_play_idle_have_xid (GstPlay *play) +{ + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, play->video_xid); +} + +static void callback_video_have_xid (GstElement *element, gint xid, GstPlay *play) { g_print("have xid %d\n", xid); - g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, xid); + play->video_xid = xid; + g_idle_add ((GSourceFunc) gst_play_idle_have_xid, play); } static void -callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play){ +gst_play_idle_have_size (GstPlay *play) +{ + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, play->video_width, play->video_height); +} +static void +callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play) +{ g_print("have size %d x %d\n", width, height); - g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, width, height); + play->video_width = width; + play->video_height = height; + g_idle_add ((GSourceFunc) gst_play_idle_have_size, play); } static void Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- play.h 19 Jun 2002 19:48:36 -0000 1.10 +++ play.h 29 Jun 2002 07:14:43 -0000 1.11 @@ -74,6 +74,10 @@ gint64 seek_time; gint64 time_nanos; gint64 length_nanos; + + gint video_xid; + gint video_width; + gint video_height; }; struct _GstPlayClass Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- playpipelines.c 19 Jun 2002 19:48:36 -0000 1.4 +++ playpipelines.c 29 Jun 2002 07:14:43 -0000 1.5 @@ -168,6 +168,191 @@ } /* + * GST_PLAY_PIPE_VIDEO + * { filesrc ! spider ! { queue ! volume ! osssink } + * spider0.src2 ! { queue ! colorspace ! xvideosink } } + */ + +static gboolean +gst_play_video_setup (GstPlay *play) +{ + GstElement *audio_bin, *audio_queue, *video_queue, *video_bin, *work_thread; + + play->pipeline = gst_pipeline_new ("main_pipeline"); + g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); + + work_thread = gst_thread_new ("work_thread"); + g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); + g_hash_table_insert(play->other_elements, "work_thread", work_thread); + + gst_bin_add (GST_BIN (play->pipeline), work_thread); + + /* create source element */ + play->source = gst_element_factory_make ("filesrc", "source"); + g_return_val_if_fail (play->source != NULL, FALSE); + gst_bin_add (GST_BIN (work_thread), play->source); + + /*auto_identity = gst_element_factory_make ("identity", "auto_identity"); + g_return_val_if_fail (auto_identity != NULL, FALSE); + g_hash_table_insert(play->other_elements, "auto_identity", auto_identity); + + gst_bin_add (GST_BIN (work_thread), auto_identity); + gst_element_add_ghost_pad (work_thread, + gst_element_get_pad (auto_identity, "src"), + "src");*/ + + /* create audio elements */ + play->volume = gst_element_factory_make ("volume", "volume"); + + play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); + g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + g_signal_connect (G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); + + audio_queue = gst_element_factory_make ("queue", "audio_queue"); + g_return_val_if_fail (audio_queue != NULL, FALSE); + g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); + + audio_bin = gst_thread_new ("audio_bin"); + g_return_val_if_fail (audio_bin != NULL, FALSE); + g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); + + gst_bin_set_pre_iterate_function(GST_BIN (audio_bin), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (audio_bin), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); + + gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); + gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); + gst_element_add_ghost_pad (audio_bin, + gst_element_get_pad (audio_queue, "sink"), + "sink"); + + gst_bin_add (GST_BIN (work_thread), audio_bin); + + /* create video elements */ + play->video_sink = gst_element_factory_make ("xvideosink", "show"); + g_object_set (G_OBJECT (play->video_sink), "toplevel", FALSE, NULL); + g_signal_connect (G_OBJECT (play->video_sink), "have_xid", + G_CALLBACK (callback_video_have_xid), play); + g_signal_connect (G_OBJECT (play->video_sink), "have_size", + G_CALLBACK (callback_video_have_size), play); + + g_return_val_if_fail (play->video_sink != NULL, FALSE); + + video_queue = gst_element_factory_make ("queue", "video_queue"); + g_return_val_if_fail (video_queue != NULL, FALSE); + g_hash_table_insert(play->other_elements, "video_queue", video_queue); + g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); + + video_bin = gst_thread_new ("video_bin"); + g_return_val_if_fail (video_bin != NULL, FALSE); + g_hash_table_insert(play->other_elements, "video_bin", video_bin); + + gst_bin_add_many (GST_BIN (video_bin), video_queue, play->video_sink, NULL); + + play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); + if (play->colorspace == NULL) + { + g_warning ("could not create the 'colorspace' element, doing without"); + gst_element_connect (video_queue, play->video_sink); + } + else + { + gst_bin_add (GST_BIN (video_bin), play->colorspace); + gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); + } + + gst_bin_set_pre_iterate_function(GST_BIN (video_bin), + (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); + gst_bin_set_post_iterate_function(GST_BIN (video_bin), + (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->video_bin_mutex); + + gst_element_add_ghost_pad (video_bin, + gst_element_get_pad (video_queue, "sink"), + "sink"); + gst_bin_add (GST_BIN (work_thread), video_bin); + //gst_element_connect (auto_identity, video_bin); + + return TRUE; +} + +static gboolean +gst_play_video_set_auto (GstPlay *play, GstElement *autoplugger){ + + GstElement *audio_bin, *video_bin, *work_thread; + + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); + //auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); + video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); + work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); + + if (play->autoplugger){ + /* we need to remove the existing autoplugger before creating a new one */ + gst_element_disconnect (play->autoplugger, audio_bin); + gst_element_disconnect (play->autoplugger, play->source); + //gst_element_disconnect (play->autoplugger, auto_identity); + gst_element_disconnect (play->autoplugger, video_bin); + + gst_bin_remove (GST_BIN (work_thread), play->autoplugger); + } + + play->autoplugger = autoplugger; + g_return_val_if_fail (play->autoplugger != NULL, FALSE); + + gst_bin_add (GST_BIN (work_thread), play->autoplugger); + gst_element_connect (play->source, play->autoplugger); + gst_element_connect (play->autoplugger, audio_bin); + //gst_element_connect (play->autoplugger, auto_identity); + gst_element_connect (play->autoplugger, video_bin); + + return TRUE; +} + +static gboolean +gst_play_video_set_video (GstPlay *play, GstElement *video_sink) +{ + GstElement *video_mate; + if (play->colorspace){ + g_print("reattach to colorspace\n"); + video_mate = play->colorspace; + } + else { + g_print("reattach to video_queue\n"); + video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); + } + + if (play->video_sink){ + gst_element_disconnect (video_mate, play->video_sink); + gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); + } + play->video_sink = video_sink; + gst_bin_add (GST_BIN (play->pipeline), play->video_sink); + gst_element_connect (video_mate, play->video_sink); + + return TRUE; +} + +static gboolean +gst_play_video_set_audio (GstPlay *play, GstElement *audio_sink) +{ + GstElement *audio_bin; + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); + + if (play->audio_sink) + { + gst_element_disconnect (play->volume, play->audio_sink); + gst_bin_remove (GST_BIN (audio_bin), play->audio_sink); + } + + play->audio_sink = audio_sink; + gst_bin_add (GST_BIN (audio_bin), play->audio_sink); + gst_element_connect (play->volume, play->audio_sink); + + return TRUE; +} + +/* * GST_PLAY_PIPE_VIDEO_THREADSAFE * { filesrc ! spider ! { queue ! volume ! osssink } } * spider0.src2 ! queue ! colorspace ! xvideosink |
From: Steve B. <sb...@us...> - 2002-07-06 15:14:12
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sat Jul 06 2002 08:14:11 PDT Log message: - decouple threaded signals in a reusable way - get rid of auto_identity Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.16&r2=1.17 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.11&r2=1.12 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- play.c 29 Jun 2002 07:14:43 -0000 1.16 +++ play.c 6 Jul 2002 15:13:58 -0000 1.17 @@ -11,6 +11,30 @@ LAST_SIGNAL, }; +/* this struct is used to decouple signals coming out of threaded pipelines */ +typedef struct _GstPlaySignal GstPlaySignal; +struct _GstPlaySignal +{ + gint signal_id; + union { + struct { + gint width; + gint height; + } video_size; + struct { + gint xid; + } video_xid; + struct { + GstElementState old_state; + GstElementState new_state; + } state; + struct { + GstElement* element; + GParamSpec* param; + } info; + } signal_data; +}; + enum { ARG_0, @@ -44,6 +68,7 @@ static void callback_bin_pre_iterate (GstBin *bin, GMutex *mutex); static void callback_bin_post_iterate (GstBin *bin, GMutex *mutex); +static gboolean gst_play_idle_signal (GstPlay *play); static gboolean gst_play_idle_callback (GstPlay *play); static gboolean gst_play_get_length_callback (GstPlay *play); static gboolean gst_play_tick_callback (GstPlay *play); @@ -176,8 +201,6 @@ -/* initializes the pipeline that should be used. - */ static void gst_play_init (GstPlay *play) { @@ -264,6 +287,8 @@ gst_dpman_set_mode(play->vol_dpman, "asynchronous"); gst_play_set_volume(play, 0.9); } + + play->signal_queue = g_async_queue_new(); return play; } @@ -280,15 +305,20 @@ static void callback_pipeline_deep_notify (GstElement *element, GstElement *orig, GParamSpec *param, GstPlay* play) { - g_signal_emit (G_OBJECT (play), gst_play_signals[INFORMATION], 0, orig, param); + GstPlaySignal *signal; + signal = g_new0(GstPlaySignal, 1); + signal->signal_id = INFORMATION; + signal->signal_data.info.element = orig; + signal->signal_data.info.param = param; + g_async_queue_push(play->signal_queue, signal); + g_idle_add ((GSourceFunc) gst_play_idle_signal, play); + /* g_print("got info from %s, %s: %s\n", GST_ELEMENT_NAME(element), GST_ELEMENT_NAME(orig), g_param_spec_get_name(param));*/ } -/* callback on changing states - * makes the pipeline state and the state of the GstPlay object match - */ static void callback_pipeline_state_change (GstElement *element, GstElementState old, GstElementState state, GstPlay* play) { + GstPlaySignal *signal; g_return_if_fail (GST_IS_ELEMENT (element)); g_return_if_fail (GST_IS_PLAY (play)); @@ -298,8 +328,7 @@ /* do additional stuff depending on state */ if (GST_IS_PIPELINE (play->pipeline)){ - switch (state) - { + switch (state) { case GST_STATE_PLAYING: g_idle_add ((GSourceFunc) gst_play_idle_callback, play); g_timeout_add (200, (GSourceFunc) gst_play_tick_callback, play); @@ -313,7 +342,49 @@ break; } } - g_signal_emit (G_OBJECT (play), gst_play_signals[STATE_CHANGE], 0, old, state); + signal = g_new0(GstPlaySignal, 1); + signal->signal_id = STATE_CHANGE; + signal->signal_data.state.old_state = old; + signal->signal_data.state.new_state = state; + g_async_queue_push(play->signal_queue, signal); + g_idle_add ((GSourceFunc) gst_play_idle_signal, play); +} + +static gboolean +gst_play_idle_signal (GstPlay *play) +{ + GstPlaySignal *signal; + gint queue_length; + + signal = g_async_queue_try_pop(play->signal_queue); + if (signal == NULL){ + return FALSE; + } + + switch (signal->signal_id){ + case HAVE_XID: + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, + signal->signal_data.video_xid.xid); + break; + case HAVE_VIDEO_SIZE: + g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, + signal->signal_data.video_size.width, signal->signal_data.video_size.height); + break; + case STATE_CHANGE: + g_signal_emit (G_OBJECT (play), gst_play_signals[STATE_CHANGE], 0, + signal->signal_data.state.old_state, signal->signal_data.state.new_state); + break; + case INFORMATION: + g_signal_emit (G_OBJECT (play), gst_play_signals[INFORMATION], 0, + signal->signal_data.info.element, signal->signal_data.info.param); + break; + default: + break; + } + + g_free(signal); + queue_length = g_async_queue_length (play->signal_queue); + return (queue_length > 0); } static gboolean @@ -330,32 +401,28 @@ } static void -gst_play_idle_have_xid (GstPlay *play) -{ - g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, play->video_xid); -} - -static void callback_video_have_xid (GstElement *element, gint xid, GstPlay *play) { + GstPlaySignal *signal; + signal = g_new0(GstPlaySignal, 1); + signal->signal_id = HAVE_XID; + signal->signal_data.video_xid.xid = xid; + g_async_queue_push(play->signal_queue, signal); + g_idle_add ((GSourceFunc) gst_play_idle_signal, play); g_print("have xid %d\n", xid); - play->video_xid = xid; - g_idle_add ((GSourceFunc) gst_play_idle_have_xid, play); -} - -static void -gst_play_idle_have_size (GstPlay *play) -{ - g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, play->video_width, play->video_height); } static void callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play) { + GstPlaySignal *signal; + signal = g_new0(GstPlaySignal, 1); + signal->signal_id = HAVE_VIDEO_SIZE; + signal->signal_data.video_size.width = width; + signal->signal_data.video_size.height = height; + g_async_queue_push(play->signal_queue, signal); + g_idle_add ((GSourceFunc) gst_play_idle_signal, play); g_print("have size %d x %d\n", width, height); - play->video_width = width; - play->video_height = height; - g_idle_add ((GSourceFunc) gst_play_idle_have_size, play); } static void Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- play.h 29 Jun 2002 07:14:43 -0000 1.11 +++ play.h 6 Jul 2002 15:13:58 -0000 1.12 @@ -75,9 +75,7 @@ gint64 time_nanos; gint64 length_nanos; - gint video_xid; - gint video_width; - gint video_height; + GAsyncQueue *signal_queue; }; struct _GstPlayClass @@ -85,7 +83,7 @@ GObjectClass parent_class; /* signals */ - void (*information) (GstPlay* play, GstElement* element, gchar *name); + void (*information) (GstPlay* play, GstElement* element, GParamSpec *param); void (*state_changed) (GstPlay* play, GstElementState old_state, GstElementState new_state); void (*stream_end) (GstPlay* play); void (*time_tick) (GstPlay* play, gint64 time_nanos); @@ -93,6 +91,7 @@ void (*have_xid) (GstPlay* play, gint xid); void (*have_video_size) (GstPlay* play, gint width, gint height); }; + GType gst_play_get_type (void); Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- playpipelines.c 29 Jun 2002 07:14:43 -0000 1.5 +++ playpipelines.c 6 Jul 2002 15:13:58 -0000 1.6 @@ -192,16 +192,6 @@ g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (work_thread), play->source); - /*auto_identity = gst_element_factory_make ("identity", "auto_identity"); - g_return_val_if_fail (auto_identity != NULL, FALSE); - g_hash_table_insert(play->other_elements, "auto_identity", auto_identity); - - gst_bin_add (GST_BIN (work_thread), auto_identity); - gst_element_add_ghost_pad (work_thread, - gst_element_get_pad (auto_identity, "src"), - "src");*/ - - /* create audio elements */ play->volume = gst_element_factory_make ("volume", "volume"); play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); @@ -243,7 +233,7 @@ video_queue = gst_element_factory_make ("queue", "video_queue"); g_return_val_if_fail (video_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_queue", video_queue); - g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); + /*g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL);*/ video_bin = gst_thread_new ("video_bin"); g_return_val_if_fail (video_bin != NULL, FALSE); @@ -272,7 +262,6 @@ gst_element_get_pad (video_queue, "sink"), "sink"); gst_bin_add (GST_BIN (work_thread), video_bin); - //gst_element_connect (auto_identity, video_bin); return TRUE; } @@ -283,7 +272,6 @@ GstElement *audio_bin, *video_bin, *work_thread; audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); - //auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); @@ -291,7 +279,6 @@ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, audio_bin); gst_element_disconnect (play->autoplugger, play->source); - //gst_element_disconnect (play->autoplugger, auto_identity); gst_element_disconnect (play->autoplugger, video_bin); gst_bin_remove (GST_BIN (work_thread), play->autoplugger); @@ -303,7 +290,6 @@ gst_bin_add (GST_BIN (work_thread), play->autoplugger); gst_element_connect (play->source, play->autoplugger); gst_element_connect (play->autoplugger, audio_bin); - //gst_element_connect (play->autoplugger, auto_identity); gst_element_connect (play->autoplugger, video_bin); return TRUE; |
From: Steve B. <sb...@us...> - 2002-07-09 18:43:28
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Tue Jul 09 2002 11:43:27 PDT Branch: BRANCH-RELEASE-0_4_0 Log message: back out api change in release branch Modified files: libs/gst/play : play.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.19&r2=1.19.2.1 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.19 retrieving revision 1.19.2.1 diff -u -d -r1.19 -r1.19.2.1 --- play.c 9 Jul 2002 17:39:40 -0000 1.19 +++ play.c 9 Jul 2002 18:43:15 -0000 1.19.2.1 @@ -554,14 +554,12 @@ GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, play->seek_time); if (play->audio_sink != NULL){ - gst_event_ref (s_event); audio_seek_worked = gst_element_send_event (play->audio_sink, s_event); } if (play->video_sink != NULL){ - gst_event_ref (s_event); video_seek_worked = gst_element_send_event (play->video_sink, s_event); } - gst_event_unref (s_event); + gst_event_free (s_event); if (audio_seek_worked || video_seek_worked){ play->time_nanos = gst_clock_get_time(play->clock); |
From: Steve B. <sb...@us...> - 2002-07-11 16:26:45
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Thu Jul 11 2002 09:26:43 PDT Log message: - use gnomevfssrc by default - remove timeout funcs when not playing Modified files: libs/gst/play : play.c playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.19&r2=1.20 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- play.c 9 Jul 2002 17:39:40 -0000 1.19 +++ play.c 11 Jul 2002 16:26:31 -0000 1.20 @@ -460,7 +460,7 @@ play->length_nanos = value; return FALSE; } - return TRUE; + return (gst_element_get_state(play->pipeline) == GST_STATE_PLAYING); } static gboolean @@ -474,7 +474,8 @@ play->time_seconds = secs; g_signal_emit (G_OBJECT (play), gst_play_signals [TIME_TICK], 0, play->time_nanos); } - return TRUE; + + return (gst_element_get_state(play->pipeline) == GST_STATE_PLAYING); } static gboolean Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- playpipelines.c 8 Jul 2002 13:01:42 -0000 1.7 +++ playpipelines.c 11 Jul 2002 16:26:31 -0000 1.8 @@ -1,7 +1,7 @@ /* * GST_PLAY_PIPE_AUDIO_THREADED - * { filesrc ! spider ! volume ! osssink } + * { gnomevfssrc ! spider ! volume ! osssink } */ static gboolean gst_play_audiot_setup (GstPlay *play) @@ -13,7 +13,7 @@ g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); */ /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); + play->source = gst_element_factory_make ("gnomevfssrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->source); @@ -77,7 +77,7 @@ /* * GST_PLAY_PIPE_AUDIO_HYPER_THREADED - * { filesrc ! spider ! { queue ! volume ! osssink } } + * { gnomevfssrc ! spider ! { queue ! volume ! osssink } } */ static gboolean gst_play_audioht_setup (GstPlay *play) @@ -91,7 +91,7 @@ g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); + play->source = gst_element_factory_make ("gnomevfssrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (play->pipeline), play->source); @@ -177,7 +177,7 @@ /* * GST_PLAY_PIPE_VIDEO - * { filesrc ! spider ! { queue ! volume ! osssink } + * { gnomevfssrc ! spider ! { queue ! volume ! osssink } * spider0.src2 ! { queue ! colorspace ! xvideosink } } */ @@ -196,7 +196,7 @@ gst_bin_add (GST_BIN (play->pipeline), work_thread); /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); + play->source = gst_element_factory_make ("gnomevfssrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (work_thread), play->source); @@ -352,7 +352,7 @@ /* * GST_PLAY_PIPE_VIDEO_THREADSAFE - * { filesrc ! spider ! { queue ! volume ! osssink } } + * { gnomevfssrc ! spider ! { queue ! volume ! osssink } } * spider0.src2 ! queue ! colorspace ! xvideosink * (note that the xvideosink is not contained by a thread) */ @@ -371,7 +371,7 @@ gst_bin_add (GST_BIN (play->pipeline), work_thread); /* create source element */ - play->source = gst_element_factory_make ("filesrc", "source"); + play->source = gst_element_factory_make ("gnomevfssrc", "source"); g_return_val_if_fail (play->source != NULL, FALSE); gst_bin_add (GST_BIN (work_thread), play->source); |
From: Steve B. <sb...@us...> - 2002-07-28 16:52:24
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sun Jul 28 2002 09:52:23 PDT Log message: use gconf keys for audiosink and videosink. still basically presuming xvideosink Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.21&r2=1.22 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.12&r2=1.13 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- play.c 12 Jul 2002 13:54:14 -0000 1.21 +++ play.c 28 Jul 2002 16:52:08 -0000 1.22 @@ -208,8 +208,10 @@ play->source = NULL; play->autoplugger = NULL; play->audio_sink = NULL; + play->audio_sink_element = NULL; play->colorspace = NULL; play->video_sink = NULL; + play->video_sink_element = NULL; play->volume = NULL; play->other_elements = g_hash_table_new(g_str_hash, g_str_equal); play->audio_bin_mutex = g_mutex_new(); @@ -444,18 +446,19 @@ GstFormat format = GST_FORMAT_TIME; gboolean query_worked; - if (play->audio_sink != NULL){ + g_print("trying to get length\n"); + if (play->audio_sink_element != NULL){ g_mutex_lock(play->audio_bin_mutex); - query_worked = gst_element_query (play->audio_sink, GST_PAD_QUERY_TOTAL, &format, &value); + query_worked = gst_element_query (play->audio_sink_element, GST_PAD_QUERY_TOTAL, &format, &value); g_mutex_unlock(play->audio_bin_mutex); } - else if (play->video_sink != NULL){ + else if (play->video_sink_element != NULL){ g_mutex_lock(play->video_bin_mutex); - query_worked = gst_element_query (play->video_sink, GST_PAD_QUERY_TOTAL, &format, &value); + query_worked = gst_element_query (play->video_sink_element, GST_PAD_QUERY_TOTAL, &format, &value); g_mutex_unlock(play->video_bin_mutex); } if (query_worked){ - /*g_print("got length %lld\n", value);*/ + g_print("got length %lld\n", value); g_signal_emit (G_OBJECT (play), gst_play_signals [STREAM_LENGTH], 0, value); play->length_nanos = value; return FALSE; @@ -554,13 +557,13 @@ s_event = gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, play->seek_time); - if (play->audio_sink != NULL){ + if (play->audio_sink_element != NULL){ gst_event_ref (s_event); - audio_seek_worked = gst_element_send_event (play->audio_sink, s_event); + audio_seek_worked = gst_element_send_event (play->audio_sink_element, s_event); } - if (play->video_sink != NULL){ + if (play->video_sink_element != NULL){ gst_event_ref (s_event); - video_seek_worked = gst_element_send_event (play->video_sink, s_event); + video_seek_worked = gst_element_send_event (play->video_sink_element, s_event); } gst_event_unref (s_event); @@ -575,9 +578,48 @@ gst_play_need_new_video_window(GstPlay *play) { g_return_if_fail (GST_IS_PLAY (play)); - if (GST_IS_ELEMENT(play->video_sink)){ - g_object_set(G_OBJECT(play->video_sink), "need_new_window", TRUE, NULL); + if (GST_IS_ELEMENT(play->video_sink_element)){ + g_object_set(G_OBJECT(play->video_sink_element), "need_new_window", TRUE, NULL); + } +} + +GstElement* +gst_play_get_sink_element (GstPlay *play, GstElement *element){ + GstPad *pad = NULL; + GList *elements = NULL; + GList *pads = NULL; + gboolean has_src; + + g_return_if_fail (GST_IS_PLAY (play)); + g_return_if_fail (GST_IS_ELEMENT (element)); + + if (!GST_IS_BIN(element)){ + /* since its not a bin, we'll presume this + * element is a sink element */ + return element; + } + + elements = (GList *) gst_bin_get_list (GST_BIN(element)); + /* traverse all elements looking for a src pad */ + while (elements && pad == NULL) { + element = GST_ELEMENT (elements->data); + pads = gst_element_get_pad_list (element); + has_src = FALSE; + while (pads) { + /* check for src pad */ + if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == GST_PAD_SRC) { + has_src = TRUE; + break; + } + pads = g_list_next (pads); + } + if (!has_src){ + return element; + } + elements = g_list_next (elements); } + /* we didn't find a sink element */ + return NULL; } gboolean Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- play.h 6 Jul 2002 15:13:58 -0000 1.12 +++ play.h 28 Jul 2002 16:52:08 -0000 1.13 @@ -39,6 +39,10 @@ typedef struct _GstPlay GstPlay; typedef struct _GstPlayClass GstPlayClass; +typedef struct _GstPlayIdleData GstPlayIdleData; + +typedef void (*GstPlayTimeoutAdd) (guint interval, GstPlayIdleData *data); +typedef void (*GstPlayIdleAdd) (GstPlayIdleData *data); struct _GstPlay { @@ -56,7 +60,9 @@ GstElement *source; GstElement *autoplugger; GstElement *video_sink; + GstElement *video_sink_element; GstElement *audio_sink; + GstElement *audio_sink_element; GstElement *colorspace; GstDParamManager *vol_dpman; @@ -76,6 +82,9 @@ gint64 length_nanos; GAsyncQueue *signal_queue; + + GstPlayTimeoutAdd timeout_add_func; + GstPlayIdleAdd idle_add_func; }; struct _GstPlayClass @@ -92,6 +101,11 @@ void (*have_video_size) (GstPlay* play, gint width, gint height); }; +struct _GstPlayIdleData +{ + GSourceFunc callback_func; + GstPlay *play; +}; GType gst_play_get_type (void); @@ -99,6 +113,8 @@ void gst_play_seek_to_time (GstPlay *play, gint64 time_nanos); +GstElement* gst_play_get_sink_element (GstPlay *play, GstElement *element); + gboolean gst_play_set_video_sink (GstPlay *play, GstElement *element); gboolean gst_play_set_audio_sink (GstPlay *play, GstElement *element); void gst_play_need_new_video_window (GstPlay *play); @@ -114,5 +130,7 @@ void gst_play_set_mute (GstPlay *play, gboolean mute); gboolean gst_play_get_mute (GstPlay *play); + +void gst_play_set_idle_timeout_funcs (GstPlay *play, GstPlayTimeoutAdd timeout_add_func, GstPlayIdleAdd idle_add_func); #endif /* __GSTPLAY_H__ */ Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- playpipelines.c 11 Jul 2002 16:26:31 -0000 1.8 +++ playpipelines.c 28 Jul 2002 16:52:08 -0000 1.9 @@ -204,12 +204,8 @@ if (play->volume == NULL) g_warning ("You need the volume element to use this program.\n"); - play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - if (play->audio_sink == NULL) - g_warning ("You need the osssink element to use this program.\n"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); + play->audio_sink = gst_element_factory_make ("fakesink", "fake_audio"); + play->audio_sink_element = NULL; audio_queue = gst_element_factory_make ("queue", "audio_queue"); g_return_val_if_fail (audio_queue != NULL, FALSE); @@ -233,19 +229,14 @@ gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ - play->video_sink = gst_element_factory_make ("xvideosink", "show"); - g_object_set (G_OBJECT (play->video_sink), "toplevel", FALSE, NULL); - g_signal_connect (G_OBJECT (play->video_sink), "have_xid", - G_CALLBACK (callback_video_have_xid), play); - g_signal_connect (G_OBJECT (play->video_sink), "have_size", - G_CALLBACK (callback_video_have_size), play); + play->video_sink = gst_element_factory_make ("fakesink", "fake_show"); + play->video_sink_element = NULL; g_return_val_if_fail (play->video_sink != NULL, FALSE); video_queue = gst_element_factory_make ("queue", "video_queue"); g_return_val_if_fail (video_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_queue", video_queue); - /*g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL);*/ video_bin = gst_thread_new ("video_bin"); g_return_val_if_fail (video_bin != NULL, FALSE); @@ -283,6 +274,8 @@ GstElement *audio_bin, *video_bin, *work_thread; + g_return_val_if_fail (GST_IS_ELEMENT (autoplugger), FALSE); + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); @@ -310,7 +303,10 @@ static gboolean gst_play_video_set_video (GstPlay *play, GstElement *video_sink) { - GstElement *video_mate; + GstElement *video_mate, *video_bin; + g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); + + video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); if (play->colorspace){ g_print("reattach to colorspace\n"); video_mate = play->colorspace; @@ -322,12 +318,21 @@ if (play->video_sink){ gst_element_disconnect (video_mate, play->video_sink); - gst_bin_remove (GST_BIN (play->pipeline), play->video_sink); + gst_bin_remove (GST_BIN (video_bin), play->video_sink); } play->video_sink = video_sink; - gst_bin_add (GST_BIN (play->pipeline), play->video_sink); + gst_bin_add (GST_BIN (video_bin), play->video_sink); gst_element_connect (video_mate, play->video_sink); + play->video_sink_element = gst_play_get_sink_element (play, video_sink); + + if (play->video_sink_element != NULL){ + g_signal_connect (G_OBJECT (play->video_sink_element), "have_xid", + G_CALLBACK (callback_video_have_xid), play); + g_signal_connect (G_OBJECT (play->video_sink_element), "have_size", + G_CALLBACK (callback_video_have_size), play); + g_object_set(G_OBJECT(play->video_sink_element), "need_new_window", TRUE, "toplevel", FALSE, NULL); + } return TRUE; } @@ -335,6 +340,7 @@ gst_play_video_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_bin; + g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); if (play->audio_sink) @@ -346,6 +352,13 @@ play->audio_sink = audio_sink; gst_bin_add (GST_BIN (audio_bin), play->audio_sink); gst_element_connect (play->volume, play->audio_sink); + + play->audio_sink_element = gst_play_get_sink_element (play, audio_sink); + + if (play->audio_sink_element != NULL){ + g_signal_connect (G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); + } return TRUE; } |
From: Steve B. <sb...@us...> - 2002-07-30 15:45:51
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Tue Jul 30 2002 08:45:51 PDT Log message: abstract the g_timeout_add and g_idle_add so that libgstplay can be used with other ui toolkits like fltk and QT. Wrappers will have to write idle and timeout handlers (for example using QTimer for QT). Modified files: libs/gst/play : play.c play.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.22&r2=1.23 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- play.c 28 Jul 2002 16:52:08 -0000 1.22 +++ play.c 30 Jul 2002 15:45:38 -0000 1.23 @@ -50,6 +50,9 @@ static void gst_play_class_init (GstPlayClass *klass); static void gst_play_dispose (GObject *object); +static void gst_play_default_timeout_add (guint interval, GSourceFunc function, gpointer data); +static void gst_play_default_idle_add (GSourceFunc function, gpointer data); + static void gst_play_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_play_get_property (GObject *object, guint prop_id, @@ -216,6 +219,7 @@ play->other_elements = g_hash_table_new(g_str_hash, g_str_equal); play->audio_bin_mutex = g_mutex_new(); play->video_bin_mutex = g_mutex_new(); + gst_play_set_idle_timeout_funcs(play, gst_play_default_timeout_add, gst_play_default_idle_add); } @@ -313,7 +317,7 @@ signal->signal_data.info.element = orig; signal->signal_data.info.param = param; g_async_queue_push(play->signal_queue, signal); - g_idle_add ((GSourceFunc) gst_play_idle_signal, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); /* g_print("got info from %s, %s: %s\n", GST_ELEMENT_NAME(element), GST_ELEMENT_NAME(orig), g_param_spec_get_name(param));*/ } @@ -332,15 +336,15 @@ if (GST_IS_PIPELINE (play->pipeline)){ switch (state) { case GST_STATE_PLAYING: - g_idle_add ((GSourceFunc) gst_play_idle_callback, play); - g_timeout_add (200, (GSourceFunc) gst_play_tick_callback, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_callback, play); + play->timeout_add_func (200, (GSourceFunc) gst_play_tick_callback, play); if (play->length_nanos == 0LL){ - g_timeout_add (200, (GSourceFunc) gst_play_get_length_callback, play); + /* try to get the length up to 16 times */ + play->get_length_attempt = 16; + play->timeout_add_func (200, (GSourceFunc) gst_play_get_length_callback, play); } break; - case GST_STATE_PAUSED: default: - g_idle_remove_by_data(play); break; } } @@ -349,7 +353,7 @@ signal->signal_data.state.old_state = old; signal->signal_data.state.new_state = state; g_async_queue_push(play->signal_queue, signal); - g_idle_add ((GSourceFunc) gst_play_idle_signal, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); } static gboolean @@ -399,7 +403,7 @@ static void callback_audio_sink_eos (GstElement *element, GstPlay *play) { - g_idle_add ((GSourceFunc) gst_play_idle_eos, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_eos, play); } static void @@ -410,7 +414,7 @@ signal->signal_id = HAVE_XID; signal->signal_data.video_xid.xid = xid; g_async_queue_push(play->signal_queue, signal); - g_idle_add ((GSourceFunc) gst_play_idle_signal, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); /*g_print("have xid %d\n", xid);*/ } @@ -423,7 +427,7 @@ signal->signal_data.video_size.width = width; signal->signal_data.video_size.height = height; g_async_queue_push(play->signal_queue, signal); - g_idle_add ((GSourceFunc) gst_play_idle_signal, play); + play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); /*g_print("have size %d x %d\n", width, height);*/ } @@ -463,6 +467,12 @@ play->length_nanos = value; return FALSE; } + else { + if (play->get_length_attempt-- < 1){ + /* we've tried enough times, give up */ + return FALSE; + } + } return (gst_element_get_state(play->pipeline) == GST_STATE_PLAYING); } @@ -581,6 +591,44 @@ if (GST_IS_ELEMENT(play->video_sink_element)){ g_object_set(G_OBJECT(play->video_sink_element), "need_new_window", TRUE, NULL); } +} + +static gboolean +gst_play_default_idle (GstPlayIdleData *idle_data) +{ + if(idle_data->func(idle_data->data)){ + /* call this function again in the future */ + return TRUE; + } + /* this function should no longer be called */ + g_free(idle_data); + return FALSE; +} + +static void +gst_play_default_timeout_add (guint interval, GSourceFunc function, gpointer data) +{ + GstPlayIdleData *idle_data = g_new0(GstPlayIdleData, 1); + idle_data->func = function; + idle_data->data = data; + g_timeout_add (interval, (GSourceFunc)gst_play_default_idle, idle_data); +} + +static void +gst_play_default_idle_add (GSourceFunc function, gpointer data) +{ + GstPlayIdleData *idle_data = g_new0(GstPlayIdleData, 1); + idle_data->func = function; + idle_data->data = data; + g_idle_add ((GSourceFunc)gst_play_default_idle, idle_data); +} + +void +gst_play_set_idle_timeout_funcs (GstPlay *play, GstPlayTimeoutAdd timeout_add_func, GstPlayIdleAdd idle_add_func) +{ + g_return_if_fail (GST_IS_PLAY (play)); + play->timeout_add_func = timeout_add_func; + play->idle_add_func = idle_add_func; } GstElement* Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- play.h 28 Jul 2002 16:52:08 -0000 1.13 +++ play.h 30 Jul 2002 15:45:39 -0000 1.14 @@ -41,8 +41,8 @@ typedef struct _GstPlayClass GstPlayClass; typedef struct _GstPlayIdleData GstPlayIdleData; -typedef void (*GstPlayTimeoutAdd) (guint interval, GstPlayIdleData *data); -typedef void (*GstPlayIdleAdd) (GstPlayIdleData *data); +typedef void (*GstPlayTimeoutAdd) (guint interval, GSourceFunc function, gpointer data); +typedef void (*GstPlayIdleAdd) (GSourceFunc function, gpointer data); struct _GstPlay { @@ -77,6 +77,7 @@ gboolean need_stream_length; gboolean need_seek; gint time_seconds; + gint get_length_attempt; gint64 seek_time; gint64 time_nanos; gint64 length_nanos; @@ -103,8 +104,8 @@ struct _GstPlayIdleData { - GSourceFunc callback_func; - GstPlay *play; + GSourceFunc func; + gpointer data; }; GType gst_play_get_type (void); |
From: Steve B. <sb...@us...> - 2002-08-07 11:21:53
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Wed Aug 07 2002 04:21:52 PDT Log message: - remove colorspace from video pipeline. If you need it, insert it into your gconf video pipeline setting - apply warning patch from Joshua Modified files: libs/gst/play : play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.23&r2=1.24 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.14&r2=1.15 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- play.c 30 Jul 2002 15:45:38 -0000 1.23 +++ play.c 7 Aug 2002 11:21:39 -0000 1.24 @@ -65,8 +65,6 @@ static void callback_video_have_xid (GstElement *element, gint xid, GstPlay *play); static void callback_video_have_size (GstElement *element, gint width, gint height, GstPlay *play); -static void callback_audio_bin_pre_iterate (GstBin *bin, GstPlay *play); -static void callback_audio_bin_post_iterate (GstBin *bin, GstPlay *play); static void callback_bin_pre_iterate (GstBin *bin, GMutex *mutex); static void callback_bin_post_iterate (GstBin *bin, GMutex *mutex); @@ -95,6 +93,7 @@ (GClassInitFunc) gst_play_class_init, NULL, NULL, sizeof (GstPlay), 0, (GInstanceInitFunc) gst_play_init, + NULL }; play_type = g_type_register_static (G_TYPE_OBJECT, "GstPlay", &play_info, 0); @@ -212,7 +211,6 @@ play->autoplugger = NULL; play->audio_sink = NULL; play->audio_sink_element = NULL; - play->colorspace = NULL; play->video_sink = NULL; play->video_sink_element = NULL; play->volume = NULL; @@ -448,7 +446,7 @@ { gint64 value; GstFormat format = GST_FORMAT_TIME; - gboolean query_worked; + gboolean query_worked = FALSE; g_print("trying to get length\n"); if (play->audio_sink_element != NULL){ @@ -638,8 +636,8 @@ GList *pads = NULL; gboolean has_src; - g_return_if_fail (GST_IS_PLAY (play)); - g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_val_if_fail (GST_IS_PLAY (play), NULL); + g_return_val_if_fail (GST_IS_ELEMENT (element), NULL); if (!GST_IS_BIN(element)){ /* since its not a bin, we'll presume this @@ -673,8 +671,8 @@ gboolean gst_play_set_video_sink (GstPlay *play, GstElement *video_sink) { - g_return_if_fail (GST_IS_PLAY (play)); - g_return_if_fail (GST_IS_ELEMENT (video_sink)); + g_return_val_if_fail (GST_IS_PLAY (play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); if (gst_play_get_state (play) != GST_STATE_READY){ gst_play_set_state (play, GST_STATE_READY); @@ -691,8 +689,8 @@ gboolean gst_play_set_audio_sink (GstPlay *play, GstElement *audio_sink) { - g_return_if_fail (GST_IS_PLAY (play)); - g_return_if_fail (GST_IS_ELEMENT (audio_sink)); + g_return_val_if_fail (GST_IS_PLAY (play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); if (gst_play_get_state (play) != GST_STATE_READY){ gst_play_set_state (play, GST_STATE_READY); Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- play.h 30 Jul 2002 15:45:39 -0000 1.14 +++ play.h 7 Aug 2002 11:21:40 -0000 1.15 @@ -63,7 +63,6 @@ GstElement *video_sink_element; GstElement *audio_sink; GstElement *audio_sink_element; - GstElement *colorspace; GstDParamManager *vol_dpman; GstDParam *vol_dparam; Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- playpipelines.c 28 Jul 2002 16:52:08 -0000 1.9 +++ playpipelines.c 7 Aug 2002 11:21:40 -0000 1.10 @@ -178,7 +178,7 @@ /* * GST_PLAY_PIPE_VIDEO * { gnomevfssrc ! spider ! { queue ! volume ! osssink } - * spider0.src2 ! { queue ! colorspace ! xvideosink } } + * spider0.src2 ! { queue ! videosink } } */ static gboolean @@ -244,17 +244,7 @@ gst_bin_add_many (GST_BIN (video_bin), video_queue, play->video_sink, NULL); - play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); - if (play->colorspace == NULL) - { - g_warning ("could not create the 'colorspace' element, doing without"); - gst_element_connect (video_queue, play->video_sink); - } - else - { - gst_bin_add (GST_BIN (video_bin), play->colorspace); - gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); - } + gst_element_connect (video_queue, play->video_sink); gst_bin_set_pre_iterate_function(GST_BIN (video_bin), (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); @@ -307,14 +297,7 @@ g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); - if (play->colorspace){ - g_print("reattach to colorspace\n"); - video_mate = play->colorspace; - } - else { - g_print("reattach to video_queue\n"); - video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); - } + video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); if (play->video_sink){ gst_element_disconnect (video_mate, play->video_sink); @@ -366,7 +349,7 @@ /* * GST_PLAY_PIPE_VIDEO_THREADSAFE * { gnomevfssrc ! spider ! { queue ! volume ! osssink } } - * spider0.src2 ! queue ! colorspace ! xvideosink + * spider0.src2 ! queue ! videosink * (note that the xvideosink is not contained by a thread) */ static gboolean @@ -446,18 +429,7 @@ g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); gst_bin_add_many (GST_BIN (play->pipeline), video_queue, play->video_sink, NULL); - - play->colorspace = gst_element_factory_make ("colorspace", "colorspace"); - if (play->colorspace == NULL) - { - g_warning ("could not create the 'colorspace' element, doing without"); - gst_element_connect (video_queue, play->video_sink); - } - else - { - gst_bin_add (GST_BIN (play->pipeline), play->colorspace); - gst_element_connect_many (video_queue, play->colorspace, play->video_sink, NULL); - } + gst_element_connect (video_queue, play->video_sink); gst_bin_set_pre_iterate_function(GST_BIN (play->pipeline), (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); @@ -502,14 +474,7 @@ gst_play_videots_set_video (GstPlay *play, GstElement *video_sink) { GstElement *video_mate; - if (play->colorspace){ - g_print("reattach to colorspace\n"); - video_mate = play->colorspace; - } - else { - g_print("reattach to video_queue\n"); - video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); - } + video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); if (play->video_sink){ gst_element_disconnect (video_mate, play->video_sink); |
From: Steve B. <sb...@us...> - 2002-08-09 19:32:55
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Fri Aug 09 2002 12:32:54 PDT Log message: patch from vishnu Modified files: libs/gst/play : play.c play.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.24&r2=1.25 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- play.c 7 Aug 2002 11:21:39 -0000 1.24 +++ play.c 9 Aug 2002 19:32:42 -0000 1.25 @@ -704,7 +704,7 @@ return FALSE; } -gint +GstElementStateReturn gst_play_set_state (GstPlay *play, GstElementState state) { g_return_val_if_fail (GST_IS_PLAY (play), GST_STATE_FAILURE); Index: play.h =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- play.h 7 Aug 2002 11:21:40 -0000 1.15 +++ play.h 9 Aug 2002 19:32:42 -0000 1.16 @@ -119,7 +119,7 @@ gboolean gst_play_set_audio_sink (GstPlay *play, GstElement *element); void gst_play_need_new_video_window (GstPlay *play); -gint gst_play_set_state (GstPlay *play, GstElementState state); +GstElementStateReturn gst_play_set_state (GstPlay *play, GstElementState state); GstElementState gst_play_get_state (GstPlay *play); gboolean gst_play_set_location (GstPlay *play, const gchar *location); |
From: Steve B. <sb...@us...> - 2002-08-20 12:28:21
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Tue Aug 20 2002 05:28:20 PDT Log message: init gstcontrol as a lib, not a plugin Modified files: libs/gst/play : play.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.25&r2=1.26 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- play.c 9 Aug 2002 19:32:42 -0000 1.25 +++ play.c 20 Aug 2002 12:28:07 -0000 1.26 @@ -196,9 +196,7 @@ G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - if (!gst_library_load ("gstcontrol")){ - g_warning("could not load gstcontrol library, volume changing won't work\n"); - } + gst_control_init(NULL,NULL); } @@ -316,7 +314,6 @@ signal->signal_data.info.param = param; g_async_queue_push(play->signal_queue, signal); play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); - /* g_print("got info from %s, %s: %s\n", GST_ELEMENT_NAME(element), GST_ELEMENT_NAME(orig), g_param_spec_get_name(param));*/ } static void |
From: Steve B. <sb...@us...> - 2002-09-10 17:02:58
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Tue Sep 10 2002 10:02:58 PDT Log message: use colorspace 24/7 Modified files: libs/gst/play : playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- playpipelines.c 7 Aug 2002 11:21:40 -0000 1.10 +++ playpipelines.c 10 Sep 2002 17:02:45 -0000 1.11 @@ -178,13 +178,13 @@ /* * GST_PLAY_PIPE_VIDEO * { gnomevfssrc ! spider ! { queue ! volume ! osssink } - * spider0.src2 ! { queue ! videosink } } + * spider0.src2 ! { queue ! colorspace ! (videosink) } } */ static gboolean gst_play_video_setup (GstPlay *play) { - GstElement *audio_bin, *audio_queue, *video_queue, *video_bin, *work_thread; + GstElement *audio_bin, *audio_queue, *video_queue, *video_bin, *work_thread, *colorspace; play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); @@ -238,13 +238,17 @@ g_return_val_if_fail (video_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_queue", video_queue); + colorspace = gst_element_factory_make ("colorspace", "colorspace"); + g_return_val_if_fail (colorspace != NULL, FALSE); + g_hash_table_insert(play->other_elements, "colorspace", colorspace); + video_bin = gst_thread_new ("video_bin"); g_return_val_if_fail (video_bin != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_bin", video_bin); - gst_bin_add_many (GST_BIN (video_bin), video_queue, play->video_sink, NULL); + gst_bin_add_many (GST_BIN (video_bin), video_queue, colorspace, play->video_sink, NULL); - gst_element_connect (video_queue, play->video_sink); + gst_element_connect_many (video_queue, colorspace, play->video_sink, NULL); gst_bin_set_pre_iterate_function(GST_BIN (video_bin), (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); @@ -297,7 +301,7 @@ g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); - video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); + video_mate = g_hash_table_lookup(play->other_elements, "colorspace"); if (play->video_sink){ gst_element_disconnect (video_mate, play->video_sink); |
From: Steve B. <sb...@us...> - 2002-10-26 04:01:11
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Fri Oct 25 2002 21:01:10 PDT Log message: applied patch from dolphy Modified files: libs/gst/play : play.c playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c.diff?r1=1.28&r2=1.29 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: play.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/play.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- play.c 25 Oct 2002 20:17:43 -0000 1.28 +++ play.c 26 Oct 2002 04:00:58 -0000 1.29 @@ -344,11 +344,8 @@ if ((play->setup_pipeline) && (! play->setup_pipeline (play, error))) { - if (*error) - { - g_object_unref (play); - return NULL; - } + g_object_unref (play); + return NULL; } Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- playpipelines.c 25 Oct 2002 21:50:31 -0000 1.13 +++ playpipelines.c 26 Oct 2002 04:00:58 -0000 1.14 @@ -25,52 +25,62 @@ * GST_PLAY_PIPE_AUDIO_THREADED * { gnomevfssrc ! spider ! volume ! osssink } */ -/* FIXME: Do GError stuff, see video */ static gboolean gst_play_audiot_setup (GstPlay *play, GError **error) { + + /* creating gst_thread */ play->pipeline = gst_thread_new ("main_pipeline"); g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); -/* - play->pipeline = gst_pipeline_new ("main_pipeline"); - g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); -*/ /* create source element */ play->source = gst_element_factory_make ("gnomevfssrc", "source"); - if (play->source == NULL) + if (!play->source) { gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error); return FALSE; } + + /* Adding element to bin */ gst_bin_add (GST_BIN (play->pipeline), play->source); /* create audio elements */ play->volume = gst_element_factory_make ("volume", "volume"); - if (play->source == NULL) + if (!play->volume) { - *error = g_error_new (GST_PLAY_ERROR, GST_PLAY_ERROR_VOLUME, - "The volume plug-in could not be found."); + gst_play_error_plugin (GST_PLAY_ERROR_VOLUME, error); return FALSE; } - if (play->volume == NULL) - g_warning ("You need the volume element to use this program.\n"); + /* creating audio_sink from osssink (?) */ play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - if (play->audio_sink == NULL) - g_warning ("You need the osssink element to use this program.\n"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); + if (!play->audio_sink) + g_warning ("You need the osssink element to use this program."); + + g_object_set ( + G_OBJECT (play->audio_sink), + "fragment", 0x00180008, NULL); + + g_signal_connect ( + G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); - gst_bin_add_many (GST_BIN (play->pipeline), play->volume, play->audio_sink, NULL); + gst_bin_add_many ( + GST_BIN (play->pipeline), play->volume, + play->audio_sink, NULL); + gst_element_connect (play->volume, play->audio_sink); - gst_bin_set_pre_iterate_function(GST_BIN (play->pipeline), - (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); - gst_bin_set_post_iterate_function(GST_BIN (play->pipeline), - (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); + gst_bin_set_pre_iterate_function( + GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + play->audio_bin_mutex); + + gst_bin_set_post_iterate_function( + GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction) callback_bin_post_iterate, + play->audio_bin_mutex); return TRUE; } |
From: Steve B. <sb...@us...> - 2002-10-26 22:45:16
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sat Oct 26 2002 15:45:15 PDT Log message: code cleanups from dolphy Modified files: libs/gst/play : playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: playpipelines.c =================================================================== RCS file: /cvsroot/gstreamer/gst-player/libs/gst/play/playpipelines.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- playpipelines.c 26 Oct 2002 04:00:58 -0000 1.14 +++ playpipelines.c 26 Oct 2002 22:45:03 -0000 1.15 @@ -20,16 +20,18 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - -/* + +/* * GST_PLAY_PIPE_AUDIO_THREADED * { gnomevfssrc ! spider ! volume ! osssink } */ - + static gboolean gst_play_audiot_setup (GstPlay *play, GError **error) { + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + /* creating gst_thread */ play->pipeline = gst_thread_new ("main_pipeline"); g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); @@ -53,7 +55,8 @@ return FALSE; } - /* creating audio_sink from osssink (?) */ + /* create audiosink. + FIXME : Should use gconf to choose the right one */ play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); if (!play->audio_sink) g_warning ("You need the osssink element to use this program."); @@ -85,9 +88,13 @@ return TRUE; } + static gboolean gst_play_audiot_set_audio (GstPlay *play, GstElement *audio_sink) { + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); + if (play->audio_sink) { gst_element_disconnect (play->volume, play->audio_sink); @@ -101,9 +108,14 @@ return TRUE; } + static gboolean -gst_play_audiot_set_auto (GstPlay *play, GstElement *autoplugger){ +gst_play_audiot_set_auto (GstPlay *play, GstElement *autoplugger) +{ + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (autoplugger), FALSE); + if (play->autoplugger){ /* we need to remove the existing autoplugger before creating a new one */ gst_element_disconnect (play->autoplugger, play->volume); @@ -120,68 +132,106 @@ return TRUE; } -/* +/* * GST_PLAY_PIPE_AUDIO_HYPER_THREADED * { gnomevfssrc ! spider ! { queue ! volume ! osssink } } */ -/* FIXME: Do GError stuff, see video */ + static gboolean gst_play_audioht_setup (GstPlay *play, GError **error) { GstElement *audio_thread, *audio_queue; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + /* play->pipeline = gst_thread_new ("main_pipeline"); g_return_val_if_fail (GST_IS_THREAD (play->pipeline), FALSE); */ + + /* creating pipeline */ play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); /* create source element */ play->source = gst_element_factory_make ("gnomevfssrc", "source"); - g_return_val_if_fail (play->source != NULL, FALSE); + if (!play->source) + { + gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error); + return FALSE; + } + + /* Adding element to bin */ gst_bin_add (GST_BIN (play->pipeline), play->source); - /* create audio elements */ + /* create audio thread */ audio_thread = gst_thread_new ("audio_thread"); g_return_val_if_fail (GST_IS_THREAD (audio_thread), FALSE); + g_hash_table_insert(play->other_elements, "audio_thread", audio_thread); + /* create audio queue */ audio_queue = gst_element_factory_make ("queue", "audio_queue"); - g_return_val_if_fail (audio_queue != NULL, FALSE); + if (!audio_queue) + { + gst_play_error_plugin (GST_PLAY_ERROR_QUEUE, error); + return FALSE; + } + g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); + /* create source element */ play->volume = gst_element_factory_make ("volume", "volume"); - if (play->volume == NULL) - g_warning ("You need the volume element to use this program.\n"); + if (!play->volume) + { + gst_play_error_plugin (GST_PLAY_ERROR_VOLUME, error); + return FALSE; + } + /* create audiosink. + FIXME : Should use gconf to choose the right one */ play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - if (play->audio_sink == NULL) - g_warning ("You need the osssink element to use this program.\n"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + if (!play->audio_sink) + g_warning ("You need the osssink element to use this program.\n"); + + g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + g_signal_connect (G_OBJECT (play->audio_sink), "eos", G_CALLBACK (callback_audio_sink_eos), play); - gst_bin_add_many (GST_BIN (audio_thread), audio_queue, play->volume, play->audio_sink, NULL); + gst_bin_add_many ( + GST_BIN (audio_thread), audio_queue, play->volume, + play->audio_sink, NULL); + gst_element_connect_many (audio_queue, play->volume, play->audio_sink); - gst_element_add_ghost_pad (audio_thread, - gst_element_get_pad (audio_queue, "sink"), - "sink"); + + gst_element_add_ghost_pad ( + audio_thread, gst_element_get_pad (audio_queue, "sink"), + "sink"); gst_bin_add (GST_BIN (play->pipeline), audio_thread); - - gst_bin_set_pre_iterate_function(GST_BIN (audio_thread), - (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); - gst_bin_set_post_iterate_function(GST_BIN (audio_thread), - (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); + gst_bin_set_pre_iterate_function( + GST_BIN (audio_thread), + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + play->audio_bin_mutex); + + gst_bin_set_post_iterate_function( + GST_BIN (audio_thread), + (GstBinPrePostIterateFunction) callback_bin_post_iterate, + play->audio_bin_mutex); return TRUE; } + static gboolean gst_play_audioht_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_thread; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); audio_thread = g_hash_table_lookup(play->other_elements, "audio_thread"); @@ -198,10 +248,14 @@ return TRUE; } + static gboolean gst_play_audioht_set_auto (GstPlay *play, GstElement *autoplugger) { GstElement *audio_thread; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (autoplugger), FALSE); audio_thread = g_hash_table_lookup(play->other_elements, "audio_thread"); @@ -234,9 +288,13 @@ GstElement *video_queue, *video_bin; GstElement *work_thread, *colorspace; + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + + /* creating pipeline */ play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); + /* creating work thread */ work_thread = gst_thread_new ("work_thread"); g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); g_hash_table_insert(play->other_elements, "work_thread", work_thread); @@ -245,67 +303,75 @@ /* create source element */ play->source = gst_element_factory_make ("gnomevfssrc", "source"); - if (play->source == NULL) + if (!play->source) { gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error); return FALSE; - } + } gst_bin_add (GST_BIN (work_thread), play->source); + /* creating volume element */ play->volume = gst_element_factory_make ("volume", "volume"); - if (play->volume == NULL) + if (!play->volume) { gst_play_error_plugin (GST_PLAY_ERROR_VOLUME, error); return FALSE; } + /* creating audio_sink element */ play->audio_sink = gst_element_factory_make ("fakesink", "fake_audio"); - if (play->audio_sink == NULL) + if (!play->audio_sink) { gst_play_error_plugin (GST_PLAY_ERROR_FAKESINK, error); return FALSE; } - play->audio_sink_element = NULL; + /* creating audio_queue element */ audio_queue = gst_element_factory_make ("queue", "audio_queue"); - if (audio_queue == NULL) + if (!audio_queue) { gst_play_error_plugin (GST_PLAY_ERROR_QUEUE, error); return FALSE; - } + } g_hash_table_insert (play->other_elements, "audio_queue", audio_queue); + /* creating audio thread */ audio_bin = gst_thread_new ("audio_bin"); - if (audio_bin == NULL) + if (!audio_bin) { gst_play_error_plugin (GST_PLAY_ERROR_THREAD, error); return FALSE; } g_hash_table_insert (play->other_elements, "audio_bin", audio_bin); + /* setting up iterate functions */ gst_bin_set_pre_iterate_function ( GST_BIN (audio_bin), - (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, play->audio_bin_mutex); gst_bin_set_post_iterate_function ( GST_BIN (audio_bin), - (GstBinPrePostIterateFunction) callback_bin_post_iterate, + (GstBinPrePostIterateFunction) callback_bin_post_iterate, play->audio_bin_mutex); - gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, - play->audio_sink, NULL); - gst_element_connect_many (audio_queue, play->volume, play->audio_sink, - NULL); - gst_element_add_ghost_pad (audio_bin, - gst_element_get_pad (audio_queue, "sink"), - "sink"); + /* adding all that stuff to bin */ + gst_bin_add_many ( + GST_BIN (audio_bin), audio_queue, play->volume, + play->audio_sink, NULL); + gst_element_connect_many (audio_queue, play->volume, + play->audio_sink, NULL); + + gst_element_add_ghost_pad ( + audio_bin, + gst_element_get_pad (audio_queue, "sink"), + "sink"); gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ play->video_sink = gst_element_factory_make ("fakesink", "fake_show"); - if (play->video_sink == NULL) + if (!play->video_sink) { gst_play_error_plugin (GST_PLAY_ERROR_FAKESINK, error); return FALSE; @@ -313,7 +379,7 @@ play->video_sink_element = NULL; video_queue = gst_element_factory_make ("queue", "video_queue"); - if (video_queue == NULL) + if (!video_queue) { gst_play_error_plugin (GST_PLAY_ERROR_QUEUE, error); return FALSE; @@ -321,7 +387,7 @@ g_hash_table_insert (play->other_elements, "video_queue", video_queue); colorspace = gst_element_factory_make ("colorspace", "colorspace"); - if (colorspace == NULL) + if (!colorspace) { gst_play_error_plugin (GST_PLAY_ERROR_COLORSPACE, error); return FALSE; @@ -329,41 +395,46 @@ g_hash_table_insert (play->other_elements, "colorspace", colorspace); video_bin = gst_thread_new ("video_bin"); - if (video_bin == NULL) + if (!video_bin) { gst_play_error_plugin (GST_PLAY_ERROR_THREAD, error); return FALSE; } g_hash_table_insert (play->other_elements, "video_bin", video_bin); + /* adding all that stuff to bin */ gst_bin_add_many (GST_BIN (video_bin), video_queue, colorspace, - play->video_sink, NULL); + play->video_sink, NULL); - gst_element_connect_many (video_queue, colorspace, play->video_sink, - NULL); + gst_element_connect_many (video_queue, colorspace, + play->video_sink, NULL); + /* setting up iterate functions */ gst_bin_set_pre_iterate_function ( - GST_BIN (video_bin), - (GstBinPrePostIterateFunction) callback_bin_pre_iterate, - play->video_bin_mutex); + GST_BIN (video_bin), + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + play->video_bin_mutex); gst_bin_set_post_iterate_function ( - GST_BIN (video_bin), - (GstBinPrePostIterateFunction) - callback_bin_post_iterate, play->video_bin_mutex); + GST_BIN (video_bin), + (GstBinPrePostIterateFunction) callback_bin_post_iterate, + play->video_bin_mutex); - gst_element_add_ghost_pad (video_bin, - gst_element_get_pad (video_queue, "sink"), - "sink"); + gst_element_add_ghost_pad ( + video_bin, gst_element_get_pad (video_queue, "sink"), + "sink"); + gst_bin_add (GST_BIN (work_thread), video_bin); return TRUE; } + static gboolean gst_play_video_set_auto (GstPlay *play, GstElement *autoplugger){ GstElement *audio_bin, *video_bin, *work_thread; + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); g_return_val_if_fail (GST_IS_ELEMENT (autoplugger), FALSE); audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); @@ -390,10 +461,13 @@ return TRUE; } + static gboolean gst_play_video_set_video (GstPlay *play, GstElement *video_sink) { GstElement *video_mate, *video_bin; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); video_bin = g_hash_table_lookup(play->other_elements, "video_bin"); @@ -419,11 +493,15 @@ return TRUE; } + static gboolean gst_play_video_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_bin; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); if (play->audio_sink) @@ -452,14 +530,19 @@ * spider0.src2 ! queue ! videosink * (note that the xvideosink is not contained by a thread) */ + static gboolean gst_play_videots_setup (GstPlay *play, GError **error) { GstElement *audio_bin, *audio_queue, *video_queue, *auto_identity, *work_thread; + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + + /* creating pipeline */ play->pipeline = gst_pipeline_new ("main_pipeline"); g_return_val_if_fail (GST_IS_PIPELINE (play->pipeline), FALSE); + /* creating work thread */ work_thread = gst_thread_new ("work_thread"); g_return_val_if_fail (GST_IS_THREAD (work_thread), FALSE); g_hash_table_insert(play->other_elements, "work_thread", work_thread); @@ -468,7 +551,11 @@ /* create source element */ play->source = gst_element_factory_make ("gnomevfssrc", "source"); - g_return_val_if_fail (play->source != NULL, FALSE); + if (!play->source) + { + gst_play_error_plugin (GST_PLAY_ERROR_GNOMEVFSSRC, error); + return FALSE; + } gst_bin_add (GST_BIN (work_thread), play->source); auto_identity = gst_element_factory_make ("identity", "auto_identity"); @@ -480,72 +567,116 @@ gst_element_get_pad (auto_identity, "src"), "src"); - /* create audio elements */ + /* create volume elements */ play->volume = gst_element_factory_make ("volume", "volume"); - if (play->volume == NULL) - g_warning ("You need the volume element to use this program.\n"); + if (!play->volume) + { + gst_play_error_plugin (GST_PLAY_ERROR_VOLUME, error); + return FALSE; + } + /* create audiosink. + FIXME : Should use gconf to choose the right one */ play->audio_sink = gst_element_factory_make ("osssink", "play_audio"); - if (play->audio_sink == NULL) - g_warning ("You need the osssink element to use this program.\n"); - g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); - g_signal_connect (G_OBJECT (play->audio_sink), "eos", - G_CALLBACK (callback_audio_sink_eos), play); + if (!play->audio_sink) + g_warning ("You need the osssink element to use this program.\n"); + + g_object_set (G_OBJECT (play->audio_sink), "fragment", 0x00180008, NULL); + g_signal_connect ( + G_OBJECT (play->audio_sink), "eos", + G_CALLBACK (callback_audio_sink_eos), play); audio_queue = gst_element_factory_make ("queue", "audio_queue"); - g_return_val_if_fail (audio_queue != NULL, FALSE); + if (!audio_queue) + { + gst_play_error_plugin (GST_PLAY_ERROR_QUEUE, error); + return FALSE; + } g_hash_table_insert(play->other_elements, "audio_queue", audio_queue); audio_bin = gst_thread_new ("audio_bin"); - g_return_val_if_fail (audio_bin != NULL, FALSE); + if (!audio_bin) + { + gst_play_error_plugin (GST_PLAY_ERROR_THREAD, error); + return FALSE; + } g_hash_table_insert(play->other_elements, "audio_bin", audio_bin); - gst_bin_set_pre_iterate_function(GST_BIN (audio_bin), - (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->audio_bin_mutex); - gst_bin_set_post_iterate_function(GST_BIN (audio_bin), - (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->audio_bin_mutex); + gst_bin_set_pre_iterate_function( + GST_BIN (audio_bin), + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + play->audio_bin_mutex); + + gst_bin_set_post_iterate_function( + GST_BIN (audio_bin), + (GstBinPrePostIterateFunction) callback_bin_post_iterate, + play->audio_bin_mutex); - gst_bin_add_many (GST_BIN (audio_bin), audio_queue, play->volume, play->audio_sink, NULL); - gst_element_connect_many (audio_queue, play->volume, play->audio_sink, NULL); - gst_element_add_ghost_pad (audio_bin, - gst_element_get_pad (audio_queue, "sink"), - "sink"); + gst_bin_add_many ( + GST_BIN (audio_bin), audio_queue, + play->volume, play->audio_sink, NULL); + + gst_element_connect_many ( + audio_queue, play->volume, + play->audio_sink, NULL); + + gst_element_add_ghost_pad ( + audio_bin, + gst_element_get_pad (audio_queue, "sink"), + "sink"); gst_bin_add (GST_BIN (work_thread), audio_bin); /* create video elements */ play->video_sink = gst_element_factory_make ("xvideosink", "show"); - g_object_set (G_OBJECT (play->video_sink), "toplevel", FALSE, NULL); - g_signal_connect (G_OBJECT (play->video_sink), "have_xid", - G_CALLBACK (callback_video_have_xid), play); - g_signal_connect (G_OBJECT (play->video_sink), "have_size", - G_CALLBACK (callback_video_have_size), play); + + g_object_set (G_OBJECT (play->video_sink), "toplevel", FALSE, NULL); + + g_signal_connect ( + G_OBJECT (play->video_sink), "have_xid", + G_CALLBACK (callback_video_have_xid), play); + + g_signal_connect ( + G_OBJECT (play->video_sink), "have_size", + G_CALLBACK (callback_video_have_size), play); g_return_val_if_fail (play->video_sink != NULL, FALSE); video_queue = gst_element_factory_make ("queue", "video_queue"); g_return_val_if_fail (video_queue != NULL, FALSE); g_hash_table_insert(play->other_elements, "video_queue", video_queue); - g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); + g_object_set (G_OBJECT (video_queue), "block_timeout", 1000, NULL); - gst_bin_add_many (GST_BIN (play->pipeline), video_queue, play->video_sink, NULL); + gst_bin_add_many ( + GST_BIN (play->pipeline), video_queue, + play->video_sink, NULL); + gst_element_connect (video_queue, play->video_sink); - gst_bin_set_pre_iterate_function(GST_BIN (play->pipeline), - (GstBinPrePostIterateFunction)callback_bin_pre_iterate, play->video_bin_mutex); - gst_bin_set_post_iterate_function(GST_BIN (play->pipeline), - (GstBinPrePostIterateFunction)callback_bin_post_iterate, play->video_bin_mutex); + gst_bin_set_pre_iterate_function( + GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction) callback_bin_pre_iterate, + play->video_bin_mutex); + + gst_bin_set_post_iterate_function( + GST_BIN (play->pipeline), + (GstBinPrePostIterateFunction) callback_bin_post_iterate, + play->video_bin_mutex); gst_element_connect (work_thread, video_queue); return TRUE; } + static gboolean gst_play_videots_set_auto (GstPlay *play, GstElement *autoplugger){ GstElement *audio_bin, *auto_identity, *work_thread; + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (autoplugger), FALSE); + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); auto_identity = g_hash_table_lookup(play->other_elements, "auto_identity"); work_thread = g_hash_table_lookup(play->other_elements, "work_thread"); @@ -570,10 +701,15 @@ return TRUE; } + static gboolean gst_play_videots_set_video (GstPlay *play, GstElement *video_sink) { GstElement *video_mate; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (video_sink), FALSE); + video_mate = g_hash_table_lookup(play->other_elements, "video_queue"); if (play->video_sink){ @@ -587,10 +723,15 @@ return TRUE; } + static gboolean gst_play_videots_set_audio (GstPlay *play, GstElement *audio_sink) { GstElement *audio_bin; + + g_return_val_if_fail (GST_IS_PLAY(play), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (audio_sink), FALSE); + audio_bin = g_hash_table_lookup(play->other_elements, "audio_bin"); if (play->audio_sink) |
From: Steve B. <sb...@us...> - 2002-10-27 21:05:55
|
CVS Root: /cvsroot/gstreamer Module: gst-player Changes by: sbaker3 Date: Sun Oct 27 2002 13:05:55 PST Log message: now found in gst-plugins/gst-libs/gst/play/ Removed files: libs/gst/play : Makefile.am play.c play.h playpipelines.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/Makefile.am http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.c http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/play.h http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-player/libs/gst/play/playpipelines.c ====Begin Diffs==== --- Makefile.am DELETED --- --- play.c DELETED --- --- play.h DELETED --- --- playpipelines.c DELETED --- |