#include <gst/gst.h>
#include <stdbool.h>

static GMainLoop *loop;

static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer user_data)
{
	switch (GST_MESSAGE_TYPE (msg)) {
		case GST_MESSAGE_EOS:
		      g_message ("End-of-stream");
		      g_main_loop_quit (loop);
		      break;
		case GST_MESSAGE_ERROR:
			g_message ("Error");
			g_main_loop_quit (loop);
			break;
		default:
			break;
	}
	return true;
}

void play_uri (gchar *uri)
{
	GstElement *pipeline;

	loop = g_main_loop_new (NULL, FALSE);

	pipeline = gst_element_factory_make ("playbin", "player");

	if (uri)
		g_object_set (G_OBJECT (pipeline), "uri", uri, NULL);

	{
		GstBus *bus;

		bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
		gst_bus_add_watch (bus, bus_call, NULL);
		gst_object_unref (bus);
	}

	gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);

	g_main_loop_run (loop);

	gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
	gst_object_unref (GST_OBJECT (pipeline));
}

int main (int argc, char *argv[])
{
	gst_init (&argc, &argv);

	if (argc > 1)
		play_uri (argv[1]);

	return 0;
}
