source: trunk/third/gstreamer/gst/gstpluginfeature.c @ 21448

Revision 21448, 5.7 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21447, which included commits to RCS files with non-trunk default branches.
Line 
1/* GStreamer
2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 *                    2000 Wim Taymans <wtay@chello.be>
4 *
5 * gstpluginfeature.c: Abstract base class for all plugin features
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22
23#include "gst_private.h"
24
25#include "gstpluginfeature.h"
26#include "gstplugin.h"
27#include "gstregistry.h"
28#include "gstinfo.h"
29
30#include <string.h>
31
32static void gst_plugin_feature_class_init (GstPluginFeatureClass * klass);
33static void gst_plugin_feature_init (GstPluginFeature * feature);
34
35static GObjectClass *parent_class = NULL;
36
37/* static guint gst_plugin_feature_signals[LAST_SIGNAL] = { 0 }; */
38
39GType
40gst_plugin_feature_get_type (void)
41{
42  static GType plugin_feature_type = 0;
43
44  if (!plugin_feature_type) {
45    static const GTypeInfo plugin_feature_info = {
46      sizeof (GObjectClass),
47      NULL,
48      NULL,
49      (GClassInitFunc) gst_plugin_feature_class_init,
50      NULL,
51      NULL,
52      sizeof (GObject),
53      0,
54      (GInstanceInitFunc) gst_plugin_feature_init,
55      NULL
56    };
57
58    plugin_feature_type =
59        g_type_register_static (G_TYPE_OBJECT, "GstPluginFeature",
60        &plugin_feature_info, G_TYPE_FLAG_ABSTRACT);
61  }
62  return plugin_feature_type;
63}
64
65static void
66gst_plugin_feature_class_init (GstPluginFeatureClass * klass)
67{
68  GObjectClass *gobject_class;
69
70  gobject_class = (GObjectClass *) klass;
71
72  parent_class = g_type_class_ref (G_TYPE_OBJECT);
73}
74
75static void
76gst_plugin_feature_init (GstPluginFeature * feature)
77{
78  feature->manager = NULL;
79}
80
81/**
82 * gst_plugin_feature_ensure_loaded:
83 * @feature: the plugin feature to check
84 *
85 * Check if the plugin containing the feature is loaded,
86 * if not, the plugin will be loaded.
87 *
88 * Returns: a boolean indicating the feature is loaded.
89 */
90gboolean
91gst_plugin_feature_ensure_loaded (GstPluginFeature * feature)
92{
93  GstPlugin *plugin;
94  static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
95
96  g_return_val_if_fail (feature != NULL, FALSE);
97  g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
98
99  plugin = (GstPlugin *) (feature->manager);
100  g_static_mutex_lock (&mutex);
101
102  if (plugin && !gst_plugin_is_loaded (plugin)) {
103#ifndef GST_DISABLE_REGISTRY
104    if (GST_IS_REGISTRY (plugin->manager)) {
105      GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING,
106          "loading plugin %s for feature", plugin->desc.name);
107
108      if (gst_registry_load_plugin (GST_REGISTRY (plugin->manager),
109              plugin) != GST_REGISTRY_OK) {
110        g_static_mutex_unlock (&mutex);
111        return FALSE;
112      }
113    } else {
114      g_static_mutex_unlock (&mutex);
115      return FALSE;
116    }
117#else /* GST_DISABLE_REGISTRY */
118    g_static_mutex_unlock (&mutex);
119    return FALSE;
120#endif
121  }
122
123  g_static_mutex_unlock (&mutex);
124  return TRUE;
125}
126
127/**
128 * gst_plugin_feature_unload_thyself:
129 * @feature: the plugin feature to check
130 *
131 * Unload the given feature. This will decrease the refcount
132 * in the plugin and will eventually unload the plugin
133 */
134void
135gst_plugin_feature_unload_thyself (GstPluginFeature * feature)
136{
137  GstPluginFeatureClass *oclass;
138
139  g_return_if_fail (feature != NULL);
140  g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
141
142  oclass = GST_PLUGIN_FEATURE_GET_CLASS (feature);
143
144  if (oclass->unload_thyself)
145    oclass->unload_thyself (feature);
146}
147
148gboolean
149gst_plugin_feature_type_name_filter (GstPluginFeature * feature,
150    GstTypeNameData * data)
151{
152  return ((data->type == 0 || data->type == G_OBJECT_TYPE (feature)) &&
153      (data->name == NULL
154          || !strcmp (data->name, GST_PLUGIN_FEATURE_NAME (feature))));
155}
156
157/**
158 * gst_plugin_feature_set_rank:
159 * @feature: feature to rank
160 * @rank: rank value - higher number means more priority rank
161 *
162 * Specifies a rank for a plugin feature, so that autoplugging uses
163 * the most appropriate feature.
164 */
165void
166gst_plugin_feature_set_rank (GstPluginFeature * feature, guint rank)
167{
168  g_return_if_fail (feature != NULL);
169  g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
170
171  feature->rank = rank;
172}
173
174/**
175 * gst_plugin_feature_set_name:
176 * @feature: a feature
177 * @name: the name to set
178 *
179 * Sets the name of a plugin feature. The name uniquely identifies a feature
180 * within all features of the same type. Renaming a plugin feature is not
181 * allowed.
182 */
183void
184gst_plugin_feature_set_name (GstPluginFeature * feature, const gchar * name)
185{
186  g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
187  g_return_if_fail (name != NULL);
188
189  if (feature->name) {
190    g_return_if_fail (strcmp (feature->name, name) == 0);
191  } else {
192    feature->name = g_strdup (name);
193  }
194}
195
196/**
197 * gst_plugin_feature_get rank:
198 * @feature: a feature
199 *
200 * Gets the rank of a plugin feature.
201 *
202 * Returns: The rank of the feature
203 */
204guint
205gst_plugin_feature_get_rank (GstPluginFeature * feature)
206{
207  g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), GST_RANK_NONE);
208
209  return feature->rank;
210}
211
212/**
213 * gst_plugin_feature_get_name:
214 * @feature: a feature
215 *
216 * Gets the name of a plugin feature.
217 *
218 * Returns: the name
219 */
220G_CONST_RETURN gchar *
221gst_plugin_feature_get_name (GstPluginFeature * feature)
222{
223  g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), NULL);
224
225  return feature->name;
226}
Note: See TracBrowser for help on using the repository browser.