discoverer: Add APIs to simply get installer details for missing plugins
authorThibault Saunier <thibault.saunier@collabora.com>
Tue, 14 Jan 2014 14:39:55 +0000 (15:39 +0100)
committerThibault Saunier <tsaunier@gnome.org>
Sat, 3 May 2014 19:48:55 +0000 (21:48 +0200)
Currently the API is far from optimal and the user has to work around
our badly defined API to simply install missing plugins.

API:
  new:
    gst_discoverer_info_get_missing_elements_installer_details

  deprecated:
    gst_discoverer_info_get_misc
    gst_discoverer_stream_info_get_misc

https://bugzilla.gnome.org/show_bug.cgi?id=720596

docs/libs/gst-plugins-base-libs-sections.txt
gst-libs/gst/pbutils/gstdiscoverer-types.c
gst-libs/gst/pbutils/gstdiscoverer.c
gst-libs/gst/pbutils/gstdiscoverer.h
gst-libs/gst/pbutils/pbutils-private.h
tools/gst-discoverer.c

index 6d86634..a7cbf7f 100644 (file)
@@ -2761,6 +2761,7 @@ gst_discoverer_stream_info_ref
 gst_discoverer_stream_info_unref
 gst_discoverer_stream_info_list_free
 gst_discoverer_stream_info_get_stream_type_nick
+gst_discoverer_info_get_missing_elements_installer_details
 gst_discoverer_info_get_audio_streams
 gst_discoverer_info_get_container_streams
 gst_discoverer_info_get_streams
index 8763eff..12905ef 100644 (file)
@@ -353,7 +353,7 @@ G_DEFINE_TYPE (GstDiscovererInfo, gst_discoverer_info, G_TYPE_OBJECT);
 static void
 gst_discoverer_info_init (GstDiscovererInfo * info)
 {
-  /* Nothing needs initialization */
+  info->missing_elements_details = g_ptr_array_new_with_free_func (g_free);
 }
 
 static void
@@ -375,6 +375,8 @@ gst_discoverer_info_finalize (GObject * object)
 
   if (info->toc)
     gst_toc_unref (info->toc);
+
+  g_ptr_array_unref (info->missing_elements_details);
 }
 
 static GstDiscovererInfo *
@@ -687,6 +689,9 @@ gst_discoverer_stream_info_get_stream_id (GstDiscovererStreamInfo * info)
  * gst_discoverer_stream_info_get_misc:
  * @info: a #GstDiscovererStreamInfo
  *
+ * Deprecated: This functions is deprecated since version 1.4, use
+ * gst_discoverer_stream_get_missing_elements_installer_details
+ *
  * Returns: (transfer none): additional information regarding the stream (for
  * example codec version, profile, etc..). If you wish to use the #GstStructure
  * after the life-time of @info you will need to copy it.
@@ -1010,6 +1015,9 @@ DISCOVERER_INFO_ACCESSOR_CODE (seekable, gboolean, FALSE);
  * gst_discoverer_info_get_misc:
  * @info: a #GstDiscovererInfo
  *
+ * Deprecated: This functions is deprecated since version 1.4, use
+ * gst_discoverer_info_get_missing_elements_installer_details
+ *
  * Returns: (transfer none): Miscellaneous information stored as a #GstStructure
  * (for example: information about missing plugins). If you wish to use the
  * #GstStructure after the life-time of @info, you will need to copy it.
@@ -1068,3 +1076,38 @@ DISCOVERER_INFO_ACCESSOR_CODE (toc, const GstToc *, NULL);
  *
  * Decrements the reference count of @info.
  */
+
+
+/**
+ * gst_discoverer_info_get_missing_elements_installer_details:
+ * @info: a #GstDiscovererStreamInfo to retrieve installer detail
+ * for the missing element
+ *
+ * Get the installer details for missing elements
+ *
+ * Returns: (transfer full): (array zero-terminated=1): An array of strings
+ * containing informations about how to install the various missing elements
+ * for @info to be usable. Free with g_strfreev.
+ *
+ * Since: 1.4
+ */
+const gchar **
+gst_discoverer_info_get_missing_elements_installer_details (const
+    GstDiscovererInfo * info)
+{
+
+  if (info->result != GST_DISCOVERER_MISSING_PLUGINS) {
+    GST_WARNING_OBJECT (info, "Trying to get missing element installed details "
+        "but result is not 'MISSING_PLUGINS'");
+
+    return NULL;
+  }
+
+  if (info->missing_elements_details->pdata[info->missing_elements_details->
+          len]) {
+    GST_DEBUG ("Adding NULL pointer to the end of missing_elements_details");
+    g_ptr_array_add (info->missing_elements_details, NULL);
+  }
+
+  return (const gchar **) info->missing_elements_details->pdata;
+}
index ab5683d..337cd32 100644 (file)
@@ -1383,9 +1383,13 @@ handle_message (GstDiscoverer * dc, GstMessage * msg)
         GST_DEBUG_OBJECT (GST_MESSAGE_SRC (msg),
             "Setting result to MISSING_PLUGINS");
         dc->priv->current_info->result = GST_DISCOVERER_MISSING_PLUGINS;
+        /* FIXME 2.0 Remove completely the ->misc
+         * Keep the old behaviour for now.
+         */
         if (dc->priv->current_info->misc)
           gst_structure_free (dc->priv->current_info->misc);
-        dc->priv->current_info->misc = gst_structure_copy (structure);
+        g_ptr_array_add (dc->priv->current_info->missing_elements_details,
+            gst_missing_plugin_message_get_installer_detail (msg));
       } else if (sttype == _STREAM_TOPOLOGY_QUARK) {
         if (dc->priv->current_topology)
           gst_structure_free (dc->priv->current_topology);
index 1df0f50..26d5ac4 100644 (file)
@@ -204,6 +204,7 @@ gboolean                  gst_discoverer_info_get_seekable(const GstDiscovererIn
 const GstStructure*       gst_discoverer_info_get_misc(const GstDiscovererInfo* info);
 const GstTagList*         gst_discoverer_info_get_tags(const GstDiscovererInfo* info); 
 const GstToc*             gst_discoverer_info_get_toc(const GstDiscovererInfo* info);
+const gchar**             gst_discoverer_info_get_missing_elements_installer_details(const GstDiscovererInfo* info);
 
 GList *                   gst_discoverer_info_get_streams (GstDiscovererInfo *info,
                                                           GType streamtype);
index 82fd22c..7424243 100644 (file)
@@ -100,6 +100,7 @@ struct _GstDiscovererInfo {
   GstTagList *tags;
   GstToc *toc;
   gboolean seekable;
+  GPtrArray *missing_elements_details;
 
   gpointer _gst_reserved[GST_PADDING];
 };
index 678c5e8..db351b3 100644 (file)
@@ -409,10 +409,15 @@ print_info (GstDiscovererInfo * info, GError * err)
     {
       g_print ("Missing plugins\n");
       if (verbose) {
-        gchar *tmp =
-            gst_structure_to_string (gst_discoverer_info_get_misc (info));
-        g_print (" (%s)\n", tmp);
-        g_free (tmp);
+        gint i = 0;
+        const gchar **installer_details =
+            gst_discoverer_info_get_missing_elements_installer_details (info);
+
+        while (installer_details[i]) {
+          g_print (" (%s)\n", installer_details[i]);
+
+          i++;
+        }
       }
       break;
     }