gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r23614 - Extractor/src/plugins


From: gnunet
Subject: [GNUnet-SVN] r23614 - Extractor/src/plugins
Date: Tue, 4 Sep 2012 14:31:32 +0200

Author: grothoff
Date: 2012-09-04 14:31:32 +0200 (Tue, 04 Sep 2012)
New Revision: 23614

Modified:
   Extractor/src/plugins/gstreamer_extractor.c
Log:
refactoring initialization code to use constructor for non-mutable statics and 
using fresh gstreamer object for each file

Modified: Extractor/src/plugins/gstreamer_extractor.c
===================================================================
--- Extractor/src/plugins/gstreamer_extractor.c 2012-09-04 12:24:15 UTC (rev 
23613)
+++ Extractor/src/plugins/gstreamer_extractor.c 2012-09-04 12:31:32 UTC (rev 
23614)
@@ -768,14 +768,8 @@
   gboolean toc_print_phase;
   unsigned char time_to_leave;
   enum CurrentStreamType st;
-};
-
-
-struct InitData
-{
   GMainLoop *loop;
   GstDiscoverer *dc;
-  struct PrivStruct *ps;
 };
 
 
@@ -865,9 +859,9 @@
 
 
 static gboolean
-_run_async (struct InitData * id)
+_run_async (struct PrivStruct * ps)
 {
-  gst_discoverer_discover_uri_async (id->dc, "appsrc://");
+  gst_discoverer_discover_uri_async (ps->dc, "appsrc://");
   return FALSE;
 }
 
@@ -1599,7 +1593,7 @@
     else
       ps->toc_length += strlen (s);
     g_free (s);
-    ps->toc_depth += 1;
+    ps->toc_depth++;
     tags = gst_toc_entry_get_tags (entry);
     if (tags)
     {
@@ -1608,9 +1602,9 @@
         "%*.*s<tags>\n", ps->toc_depth * 2, ps->toc_depth * 2, " ");
       else
         ps->toc_length += strlen ("<tags>\n") + ps->toc_depth * 2;
-      ps->toc_depth += 1;
+      ps->toc_depth++;
       gst_tag_list_foreach (tags, send_toc_tags_foreach, ps);
-      ps->toc_depth -= 1;
+      ps->toc_depth--;
       if (ps->toc_print_phase)
         ps->toc_pos += g_snprintf (&ps->toc[ps->toc_pos], ps->toc_length - 
ps->toc_pos,
         "%*.*s</tags>\n", ps->toc_depth * 2, ps->toc_depth * 2, " ");
@@ -1620,7 +1614,7 @@
 
     subentries = gst_toc_entry_get_sub_entries (entry);
     g_list_foreach (subentries, send_toc_foreach, ps);
-    ps->toc_depth -= 1;
+    ps->toc_depth--;
 
     s = g_strdup_printf ("%*.*s</%s>\n", ps->toc_depth * 2, ps->toc_depth * 2, 
" ",
       gst_toc_entry_type_get_nick (entype));
@@ -1713,35 +1707,38 @@
   result = gst_discoverer_info_get_result (info);
 
   switch (result)
-  {
-  case GST_DISCOVERER_OK:
-    break;
-  case GST_DISCOVERER_URI_INVALID:
-    break;
-  case GST_DISCOVERER_ERROR:
-    break;
-  case GST_DISCOVERER_TIMEOUT:
-    break;
-  case GST_DISCOVERER_BUSY:
-    break;
-  case GST_DISCOVERER_MISSING_PLUGINS:
-    break;
-  }
+    {
+    case GST_DISCOVERER_OK:
+      break;
+    case GST_DISCOVERER_URI_INVALID:
+      break;
+    case GST_DISCOVERER_ERROR:
+      break;
+    case GST_DISCOVERER_TIMEOUT:
+      break;
+    case GST_DISCOVERER_BUSY:
+      break;
+    case GST_DISCOVERER_MISSING_PLUGINS:
+      break;
+    }
   send_info (info, ps);
 }
 
 
 static void
-_new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * 
err, struct PrivStruct * ps)
+_new_discovered_uri (GstDiscoverer * dc, 
+                    GstDiscovererInfo * info, 
+                    GError * err, 
+                    struct PrivStruct *ps)
 {
   send_discovered_info (info, ps);
 }
 
 
 static void
-_discoverer_finished (GstDiscoverer * dc, struct InitData * id)
+_discoverer_finished (GstDiscoverer * dc, struct PrivStruct *ps)
 {
-  g_main_loop_quit (id->loop);
+  g_main_loop_quit (ps->loop);
 }
 
 
@@ -1751,7 +1748,9 @@
  * the appsrc that we must handle. We set up some signals - one to push data
  * into appsrc and one to perform a seek. */
 static void
-_source_setup (GstDiscoverer * dc, GstElement * source, struct PrivStruct * ps)
+_source_setup (GstDiscoverer * dc, 
+              GstElement * source,
+              struct PrivStruct *ps)
 {
   if (ps->source)
     gst_object_unref (GST_OBJECT (ps->source));
@@ -1776,15 +1775,59 @@
 }
 
 
-static int
-initialize (struct InitData *id, struct PrivStruct *ps)
+/**
+ * This will be the main method of your plugin.
+ * Describe a bit what it does here.
+ *
+ * @param ec extraction context, here you get the API
+ *   for accessing the file data and for returning
+ *   meta data
+ */
+void
+EXTRACTOR_gstreamer_extract_method (struct EXTRACTOR_ExtractContext *ec)
 {
+  struct PrivStruct ps;
   GError *err = NULL;
-  gint timeout = 10;
 
+  memset (&ps, 0, sizeof (ps));
+  ps.dc = gst_discoverer_new (10 * GST_SECOND, &err);
+  if (NULL == ps.dc) 
+    {
+      g_print ("Error initializing: %s\n", err->message);
+      if (NULL != err)
+       g_error_free (err);
+      return;
+    }
+  if (NULL != err)
+    g_error_free (err);
+  /* connect signals */
+  g_signal_connect (ps.dc, "discovered", G_CALLBACK (_new_discovered_uri), 
&ps);
+  g_signal_connect (ps.dc, "finished", G_CALLBACK (_discoverer_finished), &ps);
+  g_signal_connect (ps.dc, "source-setup", G_CALLBACK (_source_setup), &ps);
+  ps.loop = g_main_loop_new (NULL, TRUE);
+  ps.ec = ec;
+  ps.length = ps.ec->get_size (ps.ec->cls);
+  if (ps.length == UINT_MAX)
+    ps.length = 0;
+  gst_discoverer_start (ps.dc);
+  g_psle_add ((GSourceFunc) &_run_async, &ps);
+  g_main_loop_run (ps.loop);
+  gst_discoverer_stop (ps.dc);
+  g_object_unref (ps.dc);
+  g_object_unref (ps.loop);
+}
+
+
+/**
+ * Initialize glib and globals.
+ */
+void __attribute__ ((constructor)) 
+gstreamer_init ()
+{
   gst_init (NULL, NULL);
   GST_DEBUG_CATEGORY_INIT (gstreamer_extractor, "GstExtractor",
                          0, "GStreamer-based libextractor plugin");
+
   audio_quarks = g_new0 (GQuark, 4);
   audio_quarks[0] = g_quark_from_string ("rate");
   audio_quarks[1] = g_quark_from_string ("channels");
@@ -1804,58 +1847,7 @@
   subtitle_quarks[1] = g_quark_from_string (NULL);
 
   duration_quark = g_quark_from_string ("duration");
-
-  id->dc = gst_discoverer_new (timeout * GST_SECOND, &err);
-  if (NULL == id->dc) 
-    {
-      g_print ("Error initializing: %s\n", err->message);
-      return FALSE;
-    }
-  if (err)
-    g_error_free (err);
-  /* connect signals */
-  g_signal_connect (id->dc, "discovered", G_CALLBACK (_new_discovered_uri), 
ps);
-  g_signal_connect (id->dc, "finished", G_CALLBACK (_discoverer_finished), id);
-  g_signal_connect (id->dc, "source-setup", G_CALLBACK (_source_setup), ps);
-
-  id->loop = g_main_loop_new (NULL, TRUE);
-
-  id->ps = ps;
-
-  return TRUE;
 }
 
 
-/**
- * This will be the main method of your plugin.
- * Describe a bit what it does here.
- *
- * @param ec extraction context, here you get the API
- *   for accessing the file data and for returning
- *   meta data
- */
-void
-EXTRACTOR_gstreamer_extract_method (struct EXTRACTOR_ExtractContext *ec)
-{
-  static int initialized = FALSE;
-  static struct PrivStruct ps;
-  static struct InitData id;
-
-  if ( (! initialized) &&
-       (! (initialized = initialize (&id, &ps))) )
-    return;
-
-  memset (&ps, 0, sizeof (ps));
-  ps.ec = ec;
-  ps.length = ps.ec->get_size (ps.ec->cls);
-  if (ps.length == UINT_MAX)
-    ps.length = 0;
-
-  gst_discoverer_start (id.dc);
-  g_idle_add ((GSourceFunc) &_run_async, &id);
-  g_main_loop_run (id.loop);
-  gst_discoverer_stop (id.dc);
-}
-
-
 /* end of gstreamer_extractor.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]