int GStreamer_setMedia(const char *uri) { GstElement *src, *sink; int is_video, is_http = 1; int ret = 0; if (!g_initialized) { g_error("GStreamer: library not initialized!\n"); return -1; } cleanup_pipeline(); pthread_mutex_lock(&g_mutex); g_position = 0; g_duration = 0; g_print("GStreamer: playing : %s\n", uri); is_video = strstr(uri, "264") != NULL; is_http = !strncmp(uri, "http://", strlen("http://")); g_printf("GStreamer: playing %s via %s\n", is_video ? "video" : "audio", is_http ? "http" : "filesrc"); if (is_http) g_object_set(G_OBJECT(g_httpsrc), "location", uri, NULL); else g_object_set(G_OBJECT(g_filesrc), "location", uri, NULL); //sink = (is_video) ? g_videosink : g_audiosink; sink = (is_video) ? create_video_sink() : create_audio_sink(); src = (is_http) ? g_httpsrc : g_filesrc; gst_bin_add_many(GST_BIN(g_pipeline), src, sink, NULL); if (!gst_element_link(src, sink)) { g_error("GStreamer: failed to link %s with %s\n", gst_element_get_name(src), gst_element_get_name(sink)); return -1; } gst_element_set_state(GST_ELEMENT(g_pipeline), GST_STATE_PLAYING); //gst_element_get_state(GST_ELEMENT(g_pipeline), ...); /* TODO what is signalled? */ pthread_cond_signal(&g_main_cond); pthread_mutex_unlock(&g_mutex); return ret; }
static GstElement * create_pipeline() { GstElement *pipeline = gst_pipeline_new("voicetest"); GstElement *src = create_audio_src(NULL, NULL, NULL); GstElement *sink = create_audio_sink(NULL, NULL, NULL); GstElement *volume = gst_element_factory_make("volume", "volume"); GstElement *level = gst_element_factory_make("level", "level"); GstElement *valve = gst_element_factory_make("valve", "valve"); gst_bin_add_many(GST_BIN(pipeline), src, volume, level, valve, sink, NULL); gst_element_link_many(src, volume, level, valve, sink, NULL); gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); return pipeline; }
int GStreamer_init(const char *mplayer) { GError* error; GstBus *bus; GstElement *videosink, *audiosink; int err; if (g_initialized) g_error("GStreamer: already initialized, call destroy first!\n"); g_state_callback = NULL; g_duration = 0; g_position = 0; /* pthread synchronization */ pthread_mutex_init(&g_mutex, NULL); err = pthread_cond_init(&g_main_cond, NULL); if (err) { g_error("GStreamer: failed to initialize main condition %s\n", strerror(errno)); return -1; } /* init gstreamer library */ if (!gst_init_check(NULL, NULL, &error)) { g_error("GStreamer: failed to initialize gstreamer library: [%d] %s\n", error->code, error->message); g_error_free(error); return -1; } /* create pipeline */ g_pipeline = gst_pipeline_new("pipeline"); g_pipeline_name = gst_element_get_name(GST_ELEMENT(g_pipeline)); /* register callback */ bus = gst_pipeline_get_bus(GST_PIPELINE(g_pipeline)); gst_bus_add_watch(bus, my_bus_callback, NULL); gst_object_unref(bus); #if 0 /* TODO unlinked when removed from pipeline */ /* hardcode audio/video sink */ g_videosink = create_video_sink(); g_audiosink = create_audio_sink(); if (!g_videosink || !g_audiosink) { /* TODO memory leak */ g_error("GStreamer: failed to create sink elements\n"); return -1; } #endif /* prepare http/file src */ g_filesrc = gst_element_factory_make ("filesrc", "filesrc"); g_httpsrc = gst_element_factory_make ("souphttpsrc", "httpsrc"); if (!g_filesrc || !g_httpsrc) { /* TODO memory leak */ g_error("GStreamer: failed to create src elements %x %x\n", g_filesrc, g_httpsrc); return -1; } g_object_ref(g_filesrc); g_object_ref(g_httpsrc); /* initialize pipeline */ /* TODO do for audio/video pipe separately */ if (gst_element_set_state(g_pipeline, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE) { g_error("GStreamer: could not set pipeline to ready\n"); } /* start main loop */ g_main_loop = g_main_loop_new(NULL, FALSE); err = pthread_create(&g_reader_thread, NULL, main_thread_proc, NULL); if (err) { g_error("GStreamer: failed to launch gstreamer main thread %s\n", strerror(errno)); goto err_pthread; } g_print("GStreamer: SUCCESSFULLY INITIALIZED\n"); g_initialized = 1; return 0; err_pthread: pthread_cond_destroy(&g_main_cond); pthread_mutex_destroy(&g_mutex); return err; }