commit 8038f7bd3c94985a8ceab693bc0d293b29a86757
parent 23f136448c877efd31e7555eec97d436c747f5e3
Author: LRN <lrn1986@gmail.com>
Date: Sat, 23 Feb 2013 17:40:56 +0000
GStreamer plugin: synchronize IPC
Diffstat:
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
@@ -331,7 +331,7 @@ libextractor_gstreamer_la_SOURCES = \
libextractor_gstreamer_la_LDFLAGS = \
$(PLUGINFLAGS)
libextractor_gstreamer_la_LIBADD = \
- $(GSTREAMER_LIBS) $(GSTREAMER_PBUTILS_LIBS) $(GSTREAMER_TAG_LIBS) $(GSTREAMER_APP_LIBS) $(XLIB)
+ $(GSTREAMER_LIBS) $(GSTREAMER_PBUTILS_LIBS) $(GSTREAMER_TAG_LIBS) $(GSTREAMER_APP_LIBS) $(XLIB) -lpthread
libextractor_gstreamer_la_CFLAGS = \
$(GSTREAMER_CFLAGS) $(GSTREAMER_PBUTILS_CFLAGS) $(GSTREAMER_TAG_CFLAGS) $(GSTREAMER_APP_CFALGS)
diff --git a/src/plugins/gstreamer_extractor.c b/src/plugins/gstreamer_extractor.c
@@ -29,6 +29,7 @@
#include <gst/pbutils/pbutils.h>
#include <gst/tag/tag.h>
#include <gst/app/gstappsrc.h>
+#include <pthread.h>
GST_DEBUG_CATEGORY_STATIC (gstreamer_extractor);
#define GST_CAT_DEFAULT gstreamer_extractor
@@ -47,6 +48,8 @@ GST_DEBUG_CATEGORY_STATIC (gstreamer_extractor);
*/
#define DATA_TIMEOUT 80000LL /* 80ms */
+pthread_mutex_t pipe_mutex;
+
/**
* Struct mapping GSTREAMER tags to LE tags.
*/
@@ -951,6 +954,7 @@ feed_data (GstElement * appsrc,
accumulated = 0;
data_len = 1;
+ pthread_mutex_lock (&pipe_mutex);
while ( (accumulated < size) && (data_len > 0) )
{
data_len = ps->ec->read (ps->ec->cls, (void **) &le_data, size - accumulated);
@@ -960,6 +964,7 @@ feed_data (GstElement * appsrc,
accumulated += data_len;
}
}
+ pthread_mutex_unlock (&pipe_mutex);
gst_memory_unmap (mem, &mi);
if (size == accumulated)
{
@@ -1002,7 +1007,9 @@ seek_data (GstElement * appsrc,
struct PrivStruct * ps)
{
GST_DEBUG ("seek to offset %" G_GUINT64_FORMAT, position);
+ pthread_mutex_lock (&pipe_mutex);
ps->offset = ps->ec->seek (ps->ec->cls, position, SEEK_SET);
+ pthread_mutex_unlock (&pipe_mutex);
ps->last_data_request_time = g_get_monotonic_time ();
return ps->offset == position;
}
@@ -1918,7 +1925,9 @@ send_discovered_info (GstDiscovererInfo * info,
case GST_DISCOVERER_MISSING_PLUGINS:
break;
}
+ pthread_mutex_lock (&pipe_mutex);
send_info (info, ps);
+ pthread_mutex_unlock (&pipe_mutex);
}
@@ -2087,6 +2096,8 @@ gstreamer_init ()
subtitle_quarks[1] = g_quark_from_string (NULL);
duration_quark = g_quark_from_string ("duration");
+
+ pthread_mutex_init (&pipe_mutex, NULL);
}