gstreamer_core/gst/gstbuffer.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
   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);
   224     GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src);
   247     GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src);
   225     GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src);
   248     GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src);
   226   }
   249   }
   227 
   250 
   228   if (flags & GST_BUFFER_COPY_CAPS) {
   251   if (flags & GST_BUFFER_COPY_CAPS) {
   229     gst_caps_replace (&GST_BUFFER_CAPS (dest), GST_BUFFER_CAPS (src));
   252     if (GST_BUFFER_CAPS (src))
       
   253       GST_BUFFER_CAPS (dest) = gst_caps_ref (GST_BUFFER_CAPS (src));
       
   254     else
       
   255       GST_BUFFER_CAPS (dest) = NULL;
   230   }
   256   }
   231 }
   257 }
   232 
   258 
   233 static GstBuffer *
   259 static GstBuffer *
   234 _gst_buffer_copy (GstBuffer * buffer)
   260 _gst_buffer_copy (GstBuffer * buffer)
   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 /**