[gst-devel] How to close a pipeline correctly?
Peter Cai
newptcai at gmail.com
Sun Nov 1 13:14:19 CET 2009
I wrote a simple application to try "playbin". It works fine until
the program is closed. It looks like that an assertion was triggered
but I can not find where.
Visual Studio says : "The application has requested the Runtime to
terminate in an unusual way".
Here is my code, did I missed something when I try to close the pipeline?
http://pastebin.com/m5d695fdd
gpointer playbin_thread (gpointer data)
{
GstElement *play;
GstBus *bus;
gchar* file_path = g_strdup_printf("file:///%s", data);
gchar* u8_file_path = g_convert(file_path, strlen(file_path),
"UTF-8", "GBK", NULL, NULL, NULL);
GstElement *dd;
/* init GStreamer */
loop = g_main_loop_new (NULL, FALSE);
/* set up */
play = gst_element_factory_make ("playbin", "play");
g_object_set (G_OBJECT (play), "uri", u8_file_path, NULL);
dd = gst_element_factory_make ("directdrawsink", NULL);
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(dd), play_handle);
g_object_set (G_OBJECT (play), "video-sink", dd, NULL);
bus = gst_pipeline_get_bus (GST_PIPELINE (play));
gst_bus_add_watch (bus, playbin_bus_call, loop);
gst_object_unref (bus);
gst_element_set_state (play, GST_STATE_PLAYING);
/* now run */
g_main_loop_run (loop);
/* also clean up */
gst_element_set_state (play, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (play));
return 0;
}
void playbin_start(const gchar* file_path, gulong handle)
{
gchar* path = g_strdup(file_path);
play_handle = handle;
thread = g_thread_create(playbin_thread, (gpointer)path, TRUE, NULL);
}
void playbin_stop()
{
if(loop == NULL)
return;
g_main_loop_quit (loop);
g_thread_join(thread);
}
--
look to the things around you,the immediate world around you, if you
are alive,it will mean something to you ——Paul Strand
More information about the gstreamer-devel
mailing list