Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}