libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 8038f7bd3c94985a8ceab693bc0d293b29a86757
parent 23f136448c877efd31e7555eec97d436c747f5e3
Author: LRN <lrn1986@gmail.com>
Date:   Sat, 23 Feb 2013 17:40:56 +0000

GStreamer plugin: synchronize IPC

Diffstat:
Msrc/plugins/Makefile.am | 2+-
Msrc/plugins/gstreamer_extractor.c | 11+++++++++++
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); }