X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgsttagsetter.c;h=ea54c3574ef881328a26b093cc3019f7f72f2e93;hb=e6bd5b41935f125bf43e030dcb909c3537d33b31;hp=5048a63a6f6974722ffac67d546f48cca1ec2b14;hpb=4a646e0e76cd578a70a06031e1a8fd54ae04796d;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gsttagsetter.c b/gst/gsttagsetter.c index 5048a63..ea54c35 100644 --- a/gst/gsttagsetter.c +++ b/gst/gsttagsetter.c @@ -15,12 +15,13 @@ * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. */ /** * SECTION:gsttagsetter + * @title: GstTagsetter * @short_description: Element interface that allows setting and retrieval * of media metadata * @@ -29,7 +30,7 @@ * Elements that support changing a stream's metadata will implement this * interface. Examples of such elements are 'vorbisenc', 'theoraenc' and * 'id3v2mux'. - * + * * If you just want to retrieve metadata in your application then all you * need to do is watch for tag messages on your pipeline's bus. This * interface is only for setting metadata, not for extracting it. To set tags @@ -38,34 +39,32 @@ * setting the #GstTagMergeMode that is used for tag events that arrive at the * tagsetter element (default mode is to keep existing tags). * The application should do that before the element goes to %GST_STATE_PAUSED. - * + * * Elements implementing the #GstTagSetter interface often have to merge * any tags received from upstream and the tags set by the application via * the interface. This can be done like this: * - * |[ + * |[ * GstTagMergeMode merge_mode; * const GstTagList *application_tags; * const GstTagList *event_tags; * GstTagSetter *tagsetter; * GstTagList *result; - * + * * tagsetter = GST_TAG_SETTER (element); - * + * * merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter); * application_tags = gst_tag_setter_get_tag_list (tagsetter); * event_tags = (const GstTagList *) element->event_tags; - * + * * GST_LOG_OBJECT (tagsetter, "merging tags, merge mode = %d", merge_mode); * GST_LOG_OBJECT (tagsetter, "event tags: %" GST_PTR_FORMAT, event_tags); * GST_LOG_OBJECT (tagsetter, "set tags: %" GST_PTR_FORMAT, application_tags); - * + * * result = gst_tag_list_merge (application_tags, event_tags, merge_mode); - * + * * GST_LOG_OBJECT (tagsetter, "final tags: %" GST_PTR_FORMAT, result); * ]| - * - * Last reviewed on 2006-05-18 (0.10.6) */ #ifdef HAVE_CONFIG_H @@ -83,38 +82,20 @@ typedef struct { GstTagMergeMode mode; GstTagList *list; - GStaticMutex lock; + GMutex lock; } GstTagData; -GType -gst_tag_setter_get_type (void) -{ - static volatile gsize tag_setter_type = 0; - - if (g_once_init_enter (&tag_setter_type)) { - GType _type; - static const GTypeInfo tag_setter_info = { - sizeof (GstTagSetterIFace), /* class_size */ - NULL, /* base_init */ - NULL, /* base_finalize */ - NULL, - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, - 0, - NULL - }; - - _type = g_type_register_static (G_TYPE_INTERFACE, "GstTagSetter", - &tag_setter_info, 0); - - g_type_interface_add_prerequisite (_type, GST_TYPE_ELEMENT); - - gst_tag_key = g_quark_from_static_string ("GST_TAG_SETTER"); - g_once_init_leave (&tag_setter_type, _type); - } +#define GST_TAG_DATA_LOCK(data) g_mutex_lock(&data->lock) +#define GST_TAG_DATA_UNLOCK(data) g_mutex_unlock(&data->lock) - return tag_setter_type; +G_DEFINE_INTERFACE_WITH_CODE (GstTagSetter, gst_tag_setter, GST_TYPE_ELEMENT, + gst_tag_key = g_quark_from_static_string ("gst-tag-setter-data"); + ); + +static void +gst_tag_setter_default_init (GstTagSetterInterface * klass) +{ + /* nothing to do here, it's a dummy interface */ } static void @@ -123,9 +104,9 @@ gst_tag_data_free (gpointer p) GstTagData *data = (GstTagData *) p; if (data->list) - gst_tag_list_free (data->list); + gst_tag_list_unref (data->list); - g_static_mutex_free (&data->lock); + g_mutex_clear (&data->lock); g_slice_free (GstTagData, data); } @@ -137,20 +118,22 @@ gst_tag_setter_get_data (GstTagSetter * setter) data = g_object_get_qdata (G_OBJECT (setter), gst_tag_key); if (!data) { - static GStaticMutex create_mutex = G_STATIC_MUTEX_INIT; - /* make sure no other thread is creating a GstTagData at the same time */ - g_static_mutex_lock (&create_mutex); + static GMutex create_mutex; /* no initialisation required */ + + g_mutex_lock (&create_mutex); + data = g_object_get_qdata (G_OBJECT (setter), gst_tag_key); if (!data) { data = g_slice_new (GstTagData); - g_static_mutex_init (&data->lock); + g_mutex_init (&data->lock); data->list = NULL; data->mode = GST_TAG_MERGE_KEEP; g_object_set_qdata_full (G_OBJECT (setter), gst_tag_key, data, gst_tag_data_free); } - g_static_mutex_unlock (&create_mutex); + + g_mutex_unlock (&create_mutex); } return data; @@ -162,8 +145,6 @@ gst_tag_setter_get_data (GstTagSetter * setter) * * Reset the internal taglist. Elements should call this from within the * state-change handler. - * - * Since: 0.10.22 */ void gst_tag_setter_reset_tags (GstTagSetter * setter) @@ -174,12 +155,12 @@ gst_tag_setter_reset_tags (GstTagSetter * setter) data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); if (data->list) { - gst_tag_list_free (data->list); + gst_tag_list_unref (data->list); data->list = NULL; } - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -202,14 +183,14 @@ gst_tag_setter_merge_tags (GstTagSetter * setter, const GstTagList * list, data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); if (data->list == NULL) { if (mode != GST_TAG_MERGE_KEEP_ALL) data->list = gst_tag_list_copy (list); } else { gst_tag_list_insert (data->list, list, mode); } - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -220,7 +201,7 @@ gst_tag_setter_merge_tags (GstTagSetter * setter, const GstTagList * list, * @...: more tag / value pairs to set * * Adds the given tag / value pairs on the setter using the given merge mode. - * The list must be terminated with NULL. + * The list must be terminated with %NULL. */ void gst_tag_setter_add_tags (GstTagSetter * setter, GstTagMergeMode mode, @@ -244,7 +225,7 @@ gst_tag_setter_add_tags (GstTagSetter * setter, GstTagMergeMode mode, * @...: more tag / GValue pairs to set * * Adds the given tag / GValue pairs on the setter using the given merge mode. - * The list must be terminated with NULL. + * The list must be terminated with %NULL. */ void gst_tag_setter_add_tag_values (GstTagSetter * setter, GstTagMergeMode mode, @@ -268,7 +249,7 @@ gst_tag_setter_add_tag_values (GstTagSetter * setter, GstTagMergeMode mode, * @var_args: tag / value pairs to set * * Adds the given tag / value pairs on the setter using the given merge mode. - * The list must be terminated with NULL. + * The list must be terminated with %NULL. */ void gst_tag_setter_add_tag_valist (GstTagSetter * setter, GstTagMergeMode mode, @@ -281,13 +262,13 @@ gst_tag_setter_add_tag_valist (GstTagSetter * setter, GstTagMergeMode mode, data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); if (!data->list) - data->list = gst_tag_list_new (); + data->list = gst_tag_list_new_empty (); gst_tag_list_add_valist (data->list, mode, tag, var_args); - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -298,7 +279,7 @@ gst_tag_setter_add_tag_valist (GstTagSetter * setter, GstTagMergeMode mode, * @var_args: tag / GValue pairs to set * * Adds the given tag / GValue pairs on the setter using the given merge mode. - * The list must be terminated with NULL. + * The list must be terminated with %NULL. */ void gst_tag_setter_add_tag_valist_values (GstTagSetter * setter, @@ -311,14 +292,14 @@ gst_tag_setter_add_tag_valist_values (GstTagSetter * setter, data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); if (!data->list) - data->list = gst_tag_list_new (); + data->list = gst_tag_list_new_empty (); gst_tag_list_add_valist_values (data->list, mode, tag, var_args); - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -329,8 +310,6 @@ gst_tag_setter_add_tag_valist_values (GstTagSetter * setter, * @value: GValue to set for the tag * * Adds the given tag / GValue pair on the setter using the given merge mode. - * - * Since: 0.10.24 */ void gst_tag_setter_add_tag_value (GstTagSetter * setter, @@ -343,14 +322,14 @@ gst_tag_setter_add_tag_value (GstTagSetter * setter, data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); if (!data->list) - data->list = gst_tag_list_new (); + data->list = gst_tag_list_new_empty (); gst_tag_list_add_value (data->list, mode, tag, value); - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -362,10 +341,10 @@ gst_tag_setter_add_tag_value (GstTagSetter * setter, * * This function is not thread-safe. * - * Returns: (transfer none): a current snapshot of the taglist used in the - * setter or NULL if none is used. + * Returns: (transfer none) (nullable): a current snapshot of the + * taglist used in the setter or %NULL if none is used. */ -G_CONST_RETURN GstTagList * +const GstTagList * gst_tag_setter_get_tag_list (GstTagSetter * setter) { g_return_val_if_fail (GST_IS_TAG_SETTER (setter), NULL); @@ -392,9 +371,9 @@ gst_tag_setter_set_tag_merge_mode (GstTagSetter * setter, GstTagMergeMode mode) data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); data->mode = mode; - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); } /** @@ -416,9 +395,9 @@ gst_tag_setter_get_tag_merge_mode (GstTagSetter * setter) data = gst_tag_setter_get_data (setter); - g_static_mutex_lock (&data->lock); + GST_TAG_DATA_LOCK (data); mode = data->mode; - g_static_mutex_unlock (&data->lock); + GST_TAG_DATA_UNLOCK (data); return mode; }