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