- GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
- GstBus *bus;
+ if (!pipeline || !(*source) || !demuxer || !decoder || !conv || !sink) {
+ g_printerr("One element could not be created. Exiting.\n");
+ return NULL;
+ }
+
+ GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline));
+ struct bus_call_param* data = malloc(sizeof(struct bus_call_param));
+ if(!data) {
+ g_printerr("Memory error\n");
+ return NULL;
+ }
+ data->loop = loop;
+ data->sval = sval;
+ data->cond = cond;
+ data->mutex = mutex;
+ gst_bus_add_watch(bus, bus_call, data);
+ gst_object_unref(bus);
+
+ gst_bin_add_many(GST_BIN(pipeline), *source, demuxer, decoder, conv, sink, NULL);
+
+ gst_element_link(*source, demuxer);
+ gst_element_link_many(decoder, conv, sink, NULL);
+ g_signal_connect(demuxer, "pad-added", G_CALLBACK(on_pad_added), decoder);
+
+ return pipeline;
+}
+
+struct play_file_param
+{
+ char* name;
+ GstElement *pipeline;
+ GstElement *source;
+ gint* sval;
+ GCond* cond;
+ GMutex* mutex;
+};
+
+static gpointer play_file(gpointer data)
+{
+ struct play_file_param *p = (struct play_file_param*)data;
+ char* name = p->name;
+ GstElement* pipeline = p->pipeline;
+ GstElement* source = p->source;
+ gint* sval = p->sval;
+ GCond* cond = p->cond;
+ GMutex* mutex = p->mutex;
+ free(p);