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); |
247 GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src); |
224 GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src); |
248 GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src); |
225 GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src); |
249 } |
226 } |
250 |
227 |
251 if (flags & GST_BUFFER_COPY_CAPS) { |
228 if (flags & GST_BUFFER_COPY_CAPS) { |
252 if (GST_BUFFER_CAPS (src)) |
229 gst_caps_replace (&GST_BUFFER_CAPS (dest), GST_BUFFER_CAPS (src)); |
253 GST_BUFFER_CAPS (dest) = gst_caps_ref (GST_BUFFER_CAPS (src)); |
|
254 else |
|
255 GST_BUFFER_CAPS (dest) = NULL; |
|
256 } |
230 } |
257 } |
231 } |
258 |
232 |
259 static GstBuffer * |
233 static GstBuffer * |
260 _gst_buffer_copy (GstBuffer * buffer) |
234 _gst_buffer_copy (GstBuffer * buffer) |
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 G_DEFINE_TYPE_WITH_CODE (GstSubBuffer, gst_subbuffer, GST_TYPE_BUFFER, |
543 NULL, |
510 _do_init_sub); |
544 NULL, |
|
545 gst_subbuffer_class_init, |
|
546 NULL, |
|
547 NULL, |
|
548 sizeof (GstSubBuffer), |
|
549 0, |
|
550 gst_subbuffer_init, |
|
551 NULL |
|
552 }; |
|
553 |
|
554 _gst_subbuffer_type = g_type_register_static (GST_TYPE_BUFFER, |
|
555 "GstSubBuffer", &subbuffer_info, 0); |
|
556 } |
|
557 return _gst_subbuffer_type; |
|
558 } |
|
559 |
511 |
560 static void |
512 static void |
561 gst_subbuffer_class_init (gpointer g_class, gpointer class_data) |
513 gst_subbuffer_class_init (GstSubBufferClass * klass) |
562 { |
514 { |
563 GstBufferClass *buffer_class = GST_BUFFER_CLASS (g_class); |
515 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; |
516 (GstMiniObjectFinalizeFunction) gst_subbuffer_finalize; |
569 } |
517 } |
570 |
518 |
571 static void |
519 static void |
572 gst_subbuffer_finalize (GstSubBuffer * buffer) |
520 gst_subbuffer_finalize (GstSubBuffer * buffer) |
573 { |
521 { |
574 gst_buffer_unref (buffer->parent); |
522 gst_buffer_unref (buffer->parent); |
575 |
523 |
576 GST_MINI_OBJECT_CLASS (sub_parent_class)-> |
524 ((GstMiniObjectClass *) gst_subbuffer_parent_class)->finalize |
577 finalize (GST_MINI_OBJECT_CAST (buffer)); |
525 (GST_MINI_OBJECT_CAST (buffer)); |
578 } |
526 } |
579 |
527 |
580 static void |
528 static void |
581 gst_subbuffer_init (GTypeInstance * instance, gpointer g_class) |
529 gst_subbuffer_init (GstSubBuffer * instance) |
582 { |
530 { |
583 GST_BUFFER_FLAG_SET (GST_BUFFER_CAST (instance), GST_BUFFER_FLAG_READONLY); |
531 GST_BUFFER_FLAG_SET (GST_BUFFER_CAST (instance), GST_BUFFER_FLAG_READONLY); |
584 } |
532 } |
585 |
533 |
586 /** |
534 /** |