gstreamer_core/gst/gstbuffer.c
branchRCL_3
changeset 29 567bb019e3e3
parent 0 0e761a78d257
child 30 7e817e7e631c
equal deleted inserted replaced
6:9b2c3c7a1a9c 29:567bb019e3e3
   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 //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 /**