118 #include "gstbuffer.h" |
118 #include "gstbuffer.h" |
119 #include "gstinfo.h" |
119 #include "gstinfo.h" |
120 #include "gstutils.h" |
120 #include "gstutils.h" |
121 #include "gstminiobject.h" |
121 #include "gstminiobject.h" |
122 |
122 |
|
123 static void gst_buffer_init (GTypeInstance * instance, gpointer g_class); |
|
124 static void gst_buffer_class_init (gpointer g_class, gpointer class_data); |
123 static void gst_buffer_finalize (GstBuffer * buffer); |
125 static void gst_buffer_finalize (GstBuffer * buffer); |
124 static GstBuffer *_gst_buffer_copy (GstBuffer * buffer); |
126 static GstBuffer *_gst_buffer_copy (GstBuffer * buffer); |
125 static GType gst_subbuffer_get_type (void); |
127 static GType gst_subbuffer_get_type (void); |
126 |
128 |
127 static GType _gst_subbuffer_type = 0; |
129 static GType _gst_subbuffer_type = 0; |
128 static GType _gst_buffer_type = 0; |
130 static GType _gst_buffer_type = 0; |
|
131 |
|
132 static GstMiniObjectClass *parent_class = NULL; |
129 #ifdef __SYMBIAN32__ |
133 #ifdef __SYMBIAN32__ |
130 EXPORT_C |
134 EXPORT_C |
131 #endif |
135 #endif |
132 |
136 |
133 |
137 |
138 * done from multiple threads; |
142 * done from multiple threads; |
139 * see http://bugzilla.gnome.org/show_bug.cgi?id=304551 */ |
143 * see http://bugzilla.gnome.org/show_bug.cgi?id=304551 */ |
140 g_type_class_ref (gst_buffer_get_type ()); |
144 g_type_class_ref (gst_buffer_get_type ()); |
141 g_type_class_ref (gst_subbuffer_get_type ()); |
145 g_type_class_ref (gst_subbuffer_get_type ()); |
142 } |
146 } |
143 |
147 #ifdef __SYMBIAN32__ |
144 #define _do_init \ |
148 EXPORT_C |
145 { \ |
149 #endif |
146 _gst_buffer_type = g_define_type_id; \ |
150 |
147 } |
151 |
148 |
152 GType |
149 G_DEFINE_TYPE_WITH_CODE (GstBuffer, gst_buffer, GST_TYPE_MINI_OBJECT, _do_init); |
153 gst_buffer_get_type (void) |
|
154 { |
|
155 if (G_UNLIKELY (_gst_buffer_type == 0)) { |
|
156 static const GTypeInfo buffer_info = { |
|
157 sizeof (GstBufferClass), |
|
158 NULL, |
|
159 NULL, |
|
160 gst_buffer_class_init, |
|
161 NULL, |
|
162 NULL, |
|
163 sizeof (GstBuffer), |
|
164 0, |
|
165 gst_buffer_init, |
|
166 NULL |
|
167 }; |
|
168 |
|
169 _gst_buffer_type = g_type_register_static (GST_TYPE_MINI_OBJECT, |
|
170 "GstBuffer", &buffer_info, 0); |
|
171 } |
|
172 return _gst_buffer_type; |
|
173 } |
150 |
174 |
151 static void |
175 static void |
152 gst_buffer_class_init (GstBufferClass * klass) |
176 gst_buffer_class_init (gpointer g_class, gpointer class_data) |
153 { |
177 { |
154 klass->mini_object_class.copy = (GstMiniObjectCopyFunction) _gst_buffer_copy; |
178 GstBufferClass *buffer_class = GST_BUFFER_CLASS (g_class); |
155 klass->mini_object_class.finalize = |
179 |
|
180 parent_class = g_type_class_peek_parent (g_class); |
|
181 |
|
182 buffer_class->mini_object_class.copy = |
|
183 (GstMiniObjectCopyFunction) _gst_buffer_copy; |
|
184 buffer_class->mini_object_class.finalize = |
156 (GstMiniObjectFinalizeFunction) gst_buffer_finalize; |
185 (GstMiniObjectFinalizeFunction) gst_buffer_finalize; |
|
186 |
157 } |
187 } |
158 |
188 |
159 static void |
189 static void |
160 gst_buffer_finalize (GstBuffer * buffer) |
190 gst_buffer_finalize (GstBuffer * buffer) |
161 { |
191 { |
162 g_return_if_fail (buffer != NULL); |
192 g_return_if_fail (buffer != NULL); |
163 |
193 |
164 GST_CAT_LOG (GST_CAT_BUFFER, "finalize %p", buffer); |
194 GST_CAT_LOG (GST_CAT_BUFFER, "finalize %p", buffer); |
165 |
195 |
166 /* free our data */ |
196 /* free our data */ |
167 if (G_LIKELY (buffer->malloc_data)) |
197 g_free (buffer->malloc_data); |
168 buffer->free_func (buffer->malloc_data); |
|
169 |
198 |
170 gst_caps_replace (&GST_BUFFER_CAPS (buffer), NULL); |
199 gst_caps_replace (&GST_BUFFER_CAPS (buffer), NULL); |
171 |
200 |
172 /* ((GstMiniObjectClass *) */ |
201 GST_MINI_OBJECT_CLASS (parent_class)->finalize (GST_MINI_OBJECT (buffer)); |
173 /* gst_buffer_parent_class)->finalize (GST_MINI_OBJECT_CAST (buffer)); */ |
|
174 } |
202 } |
175 |
203 |
176 /** |
204 /** |
177 * gst_buffer_copy_metadata: |
205 * gst_buffer_copy_metadata: |
178 * @dest: a destination #GstBuffer |
206 * @dest: a destination #GstBuffer |
199 GstBufferCopyFlags flags) |
227 GstBufferCopyFlags flags) |
200 { |
228 { |
201 g_return_if_fail (dest != NULL); |
229 g_return_if_fail (dest != NULL); |
202 g_return_if_fail (src != NULL); |
230 g_return_if_fail (src != NULL); |
203 |
231 |
204 /* nothing to copy if the buffers are the same */ |
|
205 if (G_UNLIKELY (dest == src)) |
|
206 return; |
|
207 |
|
208 GST_CAT_LOG (GST_CAT_BUFFER, "copy %p to %p", src, dest); |
232 GST_CAT_LOG (GST_CAT_BUFFER, "copy %p to %p", src, dest); |
209 |
233 |
210 if (flags & GST_BUFFER_COPY_FLAGS) { |
234 if (flags & GST_BUFFER_COPY_FLAGS) { |
211 guint mask; |
235 guint mask; |
212 |
236 |
213 /* copy relevant flags */ |
237 /* copy relevant flags */ |
214 mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS | |
238 mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS | |
215 GST_BUFFER_FLAG_DELTA_UNIT | GST_BUFFER_FLAG_DISCONT | |
239 GST_BUFFER_FLAG_DELTA_UNIT | GST_BUFFER_FLAG_DISCONT | |
216 GST_BUFFER_FLAG_GAP | GST_BUFFER_FLAG_MEDIA1 | |
240 GST_BUFFER_FLAG_GAP; |
217 GST_BUFFER_FLAG_MEDIA2 | GST_BUFFER_FLAG_MEDIA3; |
|
218 GST_MINI_OBJECT_FLAGS (dest) |= GST_MINI_OBJECT_FLAGS (src) & mask; |
241 GST_MINI_OBJECT_FLAGS (dest) |= GST_MINI_OBJECT_FLAGS (src) & mask; |
219 } |
242 } |
220 |
243 |
221 if (flags & GST_BUFFER_COPY_TIMESTAMPS) { |
244 if (flags & GST_BUFFER_COPY_TIMESTAMPS) { |
222 GST_BUFFER_TIMESTAMP (dest) = GST_BUFFER_TIMESTAMP (src); |
245 GST_BUFFER_TIMESTAMP (dest) = GST_BUFFER_TIMESTAMP (src); |
251 |
277 |
252 return copy; |
278 return copy; |
253 } |
279 } |
254 |
280 |
255 static void |
281 static void |
256 gst_buffer_init (GstBuffer * buffer) |
282 gst_buffer_init (GTypeInstance * instance, gpointer g_class) |
257 { |
283 { |
|
284 GstBuffer *buffer; |
|
285 |
|
286 buffer = (GstBuffer *) instance; |
|
287 |
258 GST_CAT_LOG (GST_CAT_BUFFER, "init %p", buffer); |
288 GST_CAT_LOG (GST_CAT_BUFFER, "init %p", buffer); |
259 |
289 |
260 GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; |
290 GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; |
261 GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; |
291 GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; |
262 GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE; |
292 GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE; |
263 GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE; |
293 GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE; |
264 GST_BUFFER_FREE_FUNC (buffer) = g_free; |
|
265 } |
294 } |
266 |
295 |
267 /** |
296 /** |
268 * gst_buffer_new: |
297 * gst_buffer_new: |
269 * |
298 * |
497 struct _GstSubBufferClass |
526 struct _GstSubBufferClass |
498 { |
527 { |
499 GstBufferClass buffer_class; |
528 GstBufferClass buffer_class; |
500 }; |
529 }; |
501 |
530 |
|
531 static GstBufferClass *sub_parent_class; |
|
532 |
|
533 static void gst_subbuffer_init (GTypeInstance * instance, gpointer g_class); |
|
534 static void gst_subbuffer_class_init (gpointer g_class, gpointer class_data); |
502 static void gst_subbuffer_finalize (GstSubBuffer * buffer); |
535 static void gst_subbuffer_finalize (GstSubBuffer * buffer); |
503 |
536 |
504 #define _do_init_sub \ |
537 static GType |
505 { \ |
538 gst_subbuffer_get_type (void) |
506 _gst_subbuffer_type = g_define_type_id; \ |
539 { |
507 } |
540 if (G_UNLIKELY (_gst_subbuffer_type == 0)) { |
508 |
541 static const GTypeInfo subbuffer_info = { |
509 //deviation for EXPORT_C issue Start |
542 sizeof (GstSubBufferClass), |
510 #ifndef __SYMBIAN32__ |
543 NULL, |
511 |
544 NULL, |
512 G_DEFINE_TYPE_WITH_CODE (GstSubBuffer, gst_subbuffer, GST_TYPE_BUFFER, |
545 gst_subbuffer_class_init, |
513 _do_init_sub); |
546 NULL, |
514 |
547 NULL, |
515 #else |
548 sizeof (GstSubBuffer), |
516 |
549 0, |
517 static void gst_subbuffer_init (GstSubBuffer *self); |
550 gst_subbuffer_init, |
518 static void gst_subbuffer_class_init (GstSubBufferClass *klass); |
551 NULL |
519 static gpointer gst_subbuffer_parent_class = NULL; |
552 }; |
520 static void gst_subbuffer_class_intern_init (gpointer klass) |
553 |
521 { |
554 _gst_subbuffer_type = g_type_register_static (GST_TYPE_BUFFER, |
522 gst_subbuffer_parent_class = g_type_class_peek_parent (klass); |
555 "GstSubBuffer", &subbuffer_info, 0); |
523 gst_subbuffer_class_init ((GstSubBufferClass*) klass); |
556 } |
524 } |
557 return _gst_subbuffer_type; |
525 |
558 } |
526 static GType |
|
527 gst_subbuffer_get_type (void) |
|
528 { |
|
529 static volatile gsize g_define_type_id__volatile = 0; |
|
530 if (g_once_init_enter (&g_define_type_id__volatile)) |
|
531 { |
|
532 GType g_define_type_id = |
|
533 g_type_register_static_simple (GST_TYPE_BUFFER, |
|
534 g_intern_static_string ("GstSubBuffer"), |
|
535 sizeof (GstSubBufferClass), |
|
536 (GClassInitFunc) gst_subbuffer_class_intern_init, |
|
537 sizeof (GstSubBuffer), |
|
538 (GInstanceInitFunc) gst_subbuffer_init, |
|
539 (GTypeFlags) 0); |
|
540 { /* custom code follows */ |
|
541 _do_init_sub; |
|
542 /* following custom code */ |
|
543 } |
|
544 g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); |
|
545 } |
|
546 return g_define_type_id__volatile; |
|
547 } /* closes type_name##_get_type() */ |
|
548 |
|
549 #endif //deviation for EXPORT_C issue end |
|
550 |
559 |
551 static void |
560 static void |
552 gst_subbuffer_class_init (GstSubBufferClass * klass) |
561 gst_subbuffer_class_init (gpointer g_class, gpointer class_data) |
553 { |
562 { |
554 klass->buffer_class.mini_object_class.finalize = |
563 GstBufferClass *buffer_class = GST_BUFFER_CLASS (g_class); |
|
564 |
|
565 sub_parent_class = g_type_class_peek_parent (g_class); |
|
566 |
|
567 buffer_class->mini_object_class.finalize = |
555 (GstMiniObjectFinalizeFunction) gst_subbuffer_finalize; |
568 (GstMiniObjectFinalizeFunction) gst_subbuffer_finalize; |
556 } |
569 } |
557 |
570 |
558 static void |
571 static void |
559 gst_subbuffer_finalize (GstSubBuffer * buffer) |
572 gst_subbuffer_finalize (GstSubBuffer * buffer) |
560 { |
573 { |
561 gst_buffer_unref (buffer->parent); |
574 gst_buffer_unref (buffer->parent); |
562 |
575 |
563 ((GstMiniObjectClass *) gst_subbuffer_parent_class)->finalize |
576 GST_MINI_OBJECT_CLASS (sub_parent_class)-> |
564 (GST_MINI_OBJECT_CAST (buffer)); |
577 finalize (GST_MINI_OBJECT_CAST (buffer)); |
565 } |
578 } |
566 |
579 |
567 static void |
580 static void |
568 gst_subbuffer_init (GstSubBuffer * instance) |
581 gst_subbuffer_init (GTypeInstance * instance, gpointer g_class) |
569 { |
582 { |
570 GST_BUFFER_FLAG_SET (GST_BUFFER_CAST (instance), GST_BUFFER_FLAG_READONLY); |
583 GST_BUFFER_FLAG_SET (GST_BUFFER_CAST (instance), GST_BUFFER_FLAG_READONLY); |
571 } |
584 } |
572 |
585 |
573 /** |
586 /** |