fix doc build fix autogen
[platform/upstream/gstreamer.git] / gst / gsttaginterface.c
1 /* GStreamer
2  * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
3  *
4  * gsttaginterface.c: interface for tag setting on elements
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22
23 #ifdef HAVE_CONFIG_H
24 #  include "config.h"
25 #endif
26
27 #include "gsttaginterface.h"
28 #include <gobject/gvaluecollector.h>
29 #include <string.h>
30
31 GST_DEBUG_CATEGORY_STATIC (gst_tag_interface_debug);
32 #define GST_CAT_DEFAULT tag_tag_interface_debug
33
34 static GQuark gst_tag_key;
35
36 typedef struct {
37   GstTagMergeMode       mode;
38   GstTagList *          list;
39 } GstTagData;
40
41 GType
42 gst_tag_setter_get_type (void)
43 {
44   static GType tag_setter_type = 0;
45     
46   if (! tag_setter_type) {
47     static const GTypeInfo tag_setter_info = {
48       sizeof (GstTagSetterIFace), /* class_size */
49       NULL,             /* base_init */
50       NULL,             /* base_finalize */
51       NULL,
52       NULL,             /* class_finalize */
53       NULL,             /* class_data */
54       0,
55       0,
56       NULL
57     };
58     
59     GST_DEBUG_CATEGORY_INIT (gst_tag_interface_debug, "GstTagInterface", 0, "interfaces for tagging");
60     
61     tag_setter_type = g_type_register_static (G_TYPE_INTERFACE, "GstTagSetter",
62                                               &tag_setter_info, 0);
63     
64     g_type_interface_add_prerequisite (tag_setter_type, GST_TYPE_ELEMENT);
65
66     gst_tag_key = g_quark_from_static_string ("GST_TAG_SETTER");
67   }
68   
69   return tag_setter_type;       
70 }
71 static void
72 gst_tag_data_free (gpointer p)
73 {
74   GstTagData *data = (GstTagData *) p;
75
76   if (data->list)
77     gst_tag_list_free (data->list);
78
79   g_free (data);
80 }
81 static GstTagData *
82 gst_tag_setter_get_data (GstTagSetter *setter)
83 {
84   GstTagData *data;
85
86   data = g_object_get_qdata (G_OBJECT (setter), gst_tag_key);
87   if (!data) {
88     data = g_new (GstTagData, 1);
89     data->list = NULL;
90     data->mode = GST_TAG_MERGE_KEEP;
91     g_object_set_qdata_full (G_OBJECT (setter), gst_tag_key, data, gst_tag_data_free);
92   }
93   
94   return data;
95 }
96 /**
97  * gst_tag_setter_merge:
98  * @setter: a #GstTagSetter
99  * @list: a tag list to merge from
100  * @mode: the mode to merge with
101  *
102  * Merges the given list into the setter's list using the given mode.
103  */
104 void
105 gst_tag_setter_merge (GstTagSetter *setter, const GstTagList *list, GstTagMergeMode mode)
106 {
107   GstTagData *data;
108
109   g_return_if_fail (GST_IS_TAG_SETTER (setter));
110   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
111
112   data = gst_tag_setter_get_data (setter);
113   if (!data->list) {
114     data->list = gst_tag_list_copy (list);
115   } else {
116     gst_tag_list_merge (data->list, list, mode);
117   }
118 }
119 /**
120  * gst_tag_setter_add:
121  * @setter: a #GstTagSetter
122  * @mode: the mode to use
123  * @tag: tag to set
124  * @...: more tag / value pairs to set
125  *
126  * Adds the given tag / value pairs on the setter using the given merge mode. 
127  * The list must be terminated with GST_TAG_INVALID.
128  */
129 void
130 gst_tag_setter_add (GstTagSetter *setter, GstTagMergeMode mode, const gchar *tag, ...)
131 {
132   va_list args;
133
134   g_return_if_fail (GST_IS_TAG_SETTER (setter));
135   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
136
137   va_start (args, tag);
138   gst_tag_setter_add_valist (setter, mode, tag, args);
139   va_end (args);
140 }
141 /**
142  * gst_tag_setter_add_values:
143  * @setter: a #GstTagSetter
144  * @mode: the mode to use
145  * @tag: tag to set
146  * @...: more tag / GValue pairs to set
147  *
148  * Adds the given tag / GValue pairs on the setter using the given merge mode. 
149  * The list must be terminated with GST_TAG_INVALID.
150  */
151 void
152 gst_tag_setter_add_values (GstTagSetter *setter, GstTagMergeMode mode, const gchar *tag, ...)
153 {
154   va_list args;
155
156   g_return_if_fail (GST_IS_TAG_SETTER (setter));
157   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
158
159   va_start (args, tag);
160   gst_tag_setter_add_valist_values (setter, mode, tag, args);
161   va_end (args);
162 }
163 /**
164  * gst_tag_setter_add_valist:
165  * @setter: a #GstTagSetter
166  * @mode: the mode to use
167  * @tag: tag to set
168  * @var_args: tag / value pairs to set
169  *
170  * Adds the given tag / value pairs on the setter using the given merge mode. 
171  * The list must be terminated with GST_TAG_INVALID.
172  */
173 void
174 gst_tag_setter_add_valist (GstTagSetter *setter, GstTagMergeMode mode, const gchar *tag, va_list var_args)
175 {
176   GstTagData *data;
177   
178   g_return_if_fail (GST_IS_TAG_SETTER (setter));
179   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
180
181   data = gst_tag_setter_get_data (setter);
182   if (!data->list)
183     data->list = gst_tag_list_new ();
184   
185   gst_tag_list_add_valist (data->list, mode, tag, var_args);
186 }
187 /**
188  * gst_tag_setter_add_valist_values:
189  * @setter: a #GstTagSetter
190  * @mode: the mode to use
191  * @tag: tag to set
192  * @var_args: tag / GValue pairs to set
193  *
194  * Adds the given tag / GValue pairs on the setter using the given merge mode. 
195  * The list must be terminated with GST_TAG_INVALID.
196  */
197 void
198 gst_tag_setter_add_valist_values (GstTagSetter *setter, GstTagMergeMode mode, const gchar *tag, va_list var_args)
199 {
200   GstTagData *data;
201   
202   g_return_if_fail (GST_IS_TAG_SETTER (setter));
203   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
204
205   data = gst_tag_setter_get_data (setter);
206   if (!data->list)
207     data->list = gst_tag_list_new ();
208   
209   gst_tag_list_add_valist_values (data->list, mode, tag, var_args);
210 }
211 /**
212  * gst_tag_setter_get_list:
213  * @setter: a #GstTagSetter
214  *
215  * Retrieves a copy of the current list of tags the setter uses.
216  * You need to gst_tag_list_free() the list after use.
217  *
218  * Returns: a current snapshot of the taglist used in the setter
219  *          or NULL if none is used.
220  */
221 const GstTagList *    
222 gst_tag_setter_get_list (GstTagSetter *setter)
223 {
224   g_return_val_if_fail (GST_IS_TAG_SETTER (setter), NULL);
225
226   return gst_tag_setter_get_data (setter)->list;
227 }
228 /**
229  * gst_tag_setter_set_merge_mode:
230  * @setter: a #GstTagSetter
231  * @overwrite: The mode with which tags are added
232  *
233  * Sets the given merge mode that is used for adding tags from events to tags
234  * specified by this interface. The default is #GST_TAG_MERGE_KEEP, which keeps
235  * the tags by this interface and discards tags from events.
236  */
237 void
238 gst_tag_setter_set_merge_mode (GstTagSetter *setter, GstTagMergeMode mode)
239 {
240   g_return_if_fail (GST_IS_TAG_SETTER (setter));
241   g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
242
243   gst_tag_setter_get_data (setter)->mode = mode;
244 }
245 /**
246  * gst_tag_setter_get_merge_mode:
247  * @setter: a #GstTagSetter
248  *
249  * Queries the mode by which tags inside the setter are overwritten by tags 
250  * from events
251  *
252  * Returns: the merge mode used inside the element.
253  */
254 GstTagMergeMode
255 gst_tag_setter_get_merge_mode (GstTagSetter *setter)
256 {
257   g_return_val_if_fail (GST_IS_TAG_SETTER (setter), FALSE);
258
259   return gst_tag_setter_get_data (setter)->mode;
260 }