gstreamer_core/gst/gstbuffer.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
--- a/gstreamer_core/gst/gstbuffer.c	Tue Aug 31 15:30:33 2010 +0300
+++ b/gstreamer_core/gst/gstbuffer.c	Wed Sep 01 12:16:41 2010 +0100
@@ -120,12 +120,16 @@
 #include "gstutils.h"
 #include "gstminiobject.h"
 
+static void gst_buffer_init (GTypeInstance * instance, gpointer g_class);
+static void gst_buffer_class_init (gpointer g_class, gpointer class_data);
 static void gst_buffer_finalize (GstBuffer * buffer);
 static GstBuffer *_gst_buffer_copy (GstBuffer * buffer);
 static GType gst_subbuffer_get_type (void);
 
 static GType _gst_subbuffer_type = 0;
 static GType _gst_buffer_type = 0;
+
+static GstMiniObjectClass *parent_class = NULL;
 #ifdef __SYMBIAN32__
 EXPORT_C
 #endif
@@ -140,20 +144,46 @@
   g_type_class_ref (gst_buffer_get_type ());
   g_type_class_ref (gst_subbuffer_get_type ());
 }
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
 
-#define _do_init \
-{ \
-  _gst_buffer_type = g_define_type_id; \
+
+GType
+gst_buffer_get_type (void)
+{
+  if (G_UNLIKELY (_gst_buffer_type == 0)) {
+    static const GTypeInfo buffer_info = {
+      sizeof (GstBufferClass),
+      NULL,
+      NULL,
+      gst_buffer_class_init,
+      NULL,
+      NULL,
+      sizeof (GstBuffer),
+      0,
+      gst_buffer_init,
+      NULL
+    };
+
+    _gst_buffer_type = g_type_register_static (GST_TYPE_MINI_OBJECT,
+        "GstBuffer", &buffer_info, 0);
+  }
+  return _gst_buffer_type;
 }
 
-G_DEFINE_TYPE_WITH_CODE (GstBuffer, gst_buffer, GST_TYPE_MINI_OBJECT, _do_init);
+static void
+gst_buffer_class_init (gpointer g_class, gpointer class_data)
+{
+  GstBufferClass *buffer_class = GST_BUFFER_CLASS (g_class);
 
-static void
-gst_buffer_class_init (GstBufferClass * klass)
-{
-  klass->mini_object_class.copy = (GstMiniObjectCopyFunction) _gst_buffer_copy;
-  klass->mini_object_class.finalize =
+  parent_class = g_type_class_peek_parent (g_class);
+
+  buffer_class->mini_object_class.copy =
+      (GstMiniObjectCopyFunction) _gst_buffer_copy;
+  buffer_class->mini_object_class.finalize =
       (GstMiniObjectFinalizeFunction) gst_buffer_finalize;
+
 }
 
 static void
@@ -164,13 +194,11 @@
   GST_CAT_LOG (GST_CAT_BUFFER, "finalize %p", buffer);
 
   /* free our data */
-  if (G_LIKELY (buffer->malloc_data))
-    buffer->free_func (buffer->malloc_data);
+  g_free (buffer->malloc_data);
 
   gst_caps_replace (&GST_BUFFER_CAPS (buffer), NULL);
 
-/*   ((GstMiniObjectClass *) */
-/*       gst_buffer_parent_class)->finalize (GST_MINI_OBJECT_CAST (buffer)); */
+  GST_MINI_OBJECT_CLASS (parent_class)->finalize (GST_MINI_OBJECT (buffer));
 }
 
 /**
@@ -201,10 +229,6 @@
   g_return_if_fail (dest != NULL);
   g_return_if_fail (src != NULL);
 
-  /* nothing to copy if the buffers are the same */
-  if (G_UNLIKELY (dest == src))
-    return;
-
   GST_CAT_LOG (GST_CAT_BUFFER, "copy %p to %p", src, dest);
 
   if (flags & GST_BUFFER_COPY_FLAGS) {
@@ -213,8 +237,7 @@
     /* copy relevant flags */
     mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS |
         GST_BUFFER_FLAG_DELTA_UNIT | GST_BUFFER_FLAG_DISCONT |
-        GST_BUFFER_FLAG_GAP | GST_BUFFER_FLAG_MEDIA1 |
-        GST_BUFFER_FLAG_MEDIA2 | GST_BUFFER_FLAG_MEDIA3;
+        GST_BUFFER_FLAG_GAP;
     GST_MINI_OBJECT_FLAGS (dest) |= GST_MINI_OBJECT_FLAGS (src) & mask;
   }
 
@@ -226,7 +249,10 @@
   }
 
   if (flags & GST_BUFFER_COPY_CAPS) {
-    gst_caps_replace (&GST_BUFFER_CAPS (dest), GST_BUFFER_CAPS (src));
+    if (GST_BUFFER_CAPS (src))
+      GST_BUFFER_CAPS (dest) = gst_caps_ref (GST_BUFFER_CAPS (src));
+    else
+      GST_BUFFER_CAPS (dest) = NULL;
   }
 }
 
@@ -253,15 +279,18 @@
 }
 
 static void
-gst_buffer_init (GstBuffer * buffer)
+gst_buffer_init (GTypeInstance * instance, gpointer g_class)
 {
+  GstBuffer *buffer;
+
+  buffer = (GstBuffer *) instance;
+
   GST_CAT_LOG (GST_CAT_BUFFER, "init %p", buffer);
 
   GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
   GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
   GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
   GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
-  GST_BUFFER_FREE_FUNC (buffer) = g_free;
 }
 
 /**
@@ -499,59 +528,43 @@
   GstBufferClass buffer_class;
 };
 
+static GstBufferClass *sub_parent_class;
+
+static void gst_subbuffer_init (GTypeInstance * instance, gpointer g_class);
+static void gst_subbuffer_class_init (gpointer g_class, gpointer class_data);
 static void gst_subbuffer_finalize (GstSubBuffer * buffer);
 
-#define _do_init_sub \
-{ \
-  _gst_subbuffer_type = g_define_type_id; \
+static GType
+gst_subbuffer_get_type (void)
+{
+  if (G_UNLIKELY (_gst_subbuffer_type == 0)) {
+    static const GTypeInfo subbuffer_info = {
+      sizeof (GstSubBufferClass),
+      NULL,
+      NULL,
+      gst_subbuffer_class_init,
+      NULL,
+      NULL,
+      sizeof (GstSubBuffer),
+      0,
+      gst_subbuffer_init,
+      NULL
+    };
+
+    _gst_subbuffer_type = g_type_register_static (GST_TYPE_BUFFER,
+        "GstSubBuffer", &subbuffer_info, 0);
+  }
+  return _gst_subbuffer_type;
 }
 
-//deviation for EXPORT_C issue Start
-#ifndef __SYMBIAN32__
-
-G_DEFINE_TYPE_WITH_CODE (GstSubBuffer, gst_subbuffer, GST_TYPE_BUFFER,
-    _do_init_sub);
-    
-#else
-
-static void     gst_subbuffer_init              (GstSubBuffer        *self); 
-static void     gst_subbuffer_class_init        (GstSubBufferClass *klass); 
-static gpointer gst_subbuffer_parent_class = NULL; 
-static void     gst_subbuffer_class_intern_init (gpointer klass) 
-{ 
-  gst_subbuffer_parent_class = g_type_class_peek_parent (klass); 
-  gst_subbuffer_class_init ((GstSubBufferClass*) klass); 
-} 
+static void
+gst_subbuffer_class_init (gpointer g_class, gpointer class_data)
+{
+  GstBufferClass *buffer_class = GST_BUFFER_CLASS (g_class);
 
-static GType 
-gst_subbuffer_get_type (void) 
-{ 
-  static volatile gsize g_define_type_id__volatile = 0; 
-  if (g_once_init_enter (&g_define_type_id__volatile))  
-    { 
-      GType g_define_type_id = 
-        g_type_register_static_simple (GST_TYPE_BUFFER, 
-                                       g_intern_static_string ("GstSubBuffer"), 
-                                       sizeof (GstSubBufferClass), 
-                                       (GClassInitFunc) gst_subbuffer_class_intern_init, 
-                                       sizeof (GstSubBuffer), 
-                                       (GInstanceInitFunc) gst_subbuffer_init, 
-                                       (GTypeFlags) 0); 
-      { /* custom code follows */
-        _do_init_sub;
-        /* following custom code */	
-      }					
-      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); 
-    }					
-  return g_define_type_id__volatile;	
-} /* closes type_name##_get_type() */
+  sub_parent_class = g_type_class_peek_parent (g_class);
 
-#endif //deviation for EXPORT_C issue end
-
-static void
-gst_subbuffer_class_init (GstSubBufferClass * klass)
-{
-  klass->buffer_class.mini_object_class.finalize =
+  buffer_class->mini_object_class.finalize =
       (GstMiniObjectFinalizeFunction) gst_subbuffer_finalize;
 }
 
@@ -560,12 +573,12 @@
 {
   gst_buffer_unref (buffer->parent);
 
-  ((GstMiniObjectClass *) gst_subbuffer_parent_class)->finalize
-      (GST_MINI_OBJECT_CAST (buffer));
+  GST_MINI_OBJECT_CLASS (sub_parent_class)->
+      finalize (GST_MINI_OBJECT_CAST (buffer));
 }
 
 static void
-gst_subbuffer_init (GstSubBuffer * instance)
+gst_subbuffer_init (GTypeInstance * instance, gpointer g_class)
 {
   GST_BUFFER_FLAG_SET (GST_BUFFER_CAST (instance), GST_BUFFER_FLAG_READONLY);
 }