From 76cfe49b5ed32c65324ec2fd10bccd9ba4fc5169 Mon Sep 17 00:00:00 2001 From: Erik Walthinsen Date: Tue, 24 Apr 2001 19:20:15 +0000 Subject: [PATCH] - commented out remainder of Meta stuff Original commit message from CVS: - commented out remainder of Meta stuff - enhanced mem_chunk allocation to round up to nearest 32 bytes this helps ensure that GstBuffers are more likely to be on cache-lines - added free() and copy() function pointers to GstBuffer - added code in _destroy and _copy to use above routines if !NULL - fixed up _copy code to suck less --- gst/gstbuffer.c | 74 +++++++++++++++++++++++++++++++++++++------------ gst/gstbuffer.h | 16 +++++++++-- 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index 6993391efa..2bbae72dd8 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -33,8 +33,13 @@ static GMutex *_gst_buffer_chunk_lock; void _gst_buffer_initialize (void) { - _gst_buffer_chunk = g_mem_chunk_new ("GstBuffer", sizeof(GstBuffer), - sizeof(GstBuffer) * 16, G_ALLOC_AND_FREE); + buffersize = sizeof(GstBuffer); + + // round up to the nearest 32 bytes for cache-line and other efficiencies + buffersize = ((buffersize-1 / 32) + 1) * 32; + + _gst_buffer_chunk = g_mem_chunk_new ("GstBuffer", buffersize, + buffersize * 32, G_ALLOC_AND_FREE); _gst_buffer_chunk_lock = g_mutex_new (); } @@ -56,7 +61,6 @@ gst_buffer_new(void) g_mutex_unlock (_gst_buffer_chunk_lock); GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer); -// g_print("allocating new mutex\n"); buffer->lock = g_mutex_new (); #ifdef HAVE_ATOMIC_H atomic_set (&buffer->refcount, 1); @@ -69,9 +73,11 @@ gst_buffer_new(void) buffer->maxsize = 0; buffer->offset = 0; buffer->timestamp = 0; - buffer->metas = NULL; +// buffer->metas = NULL; buffer->parent = NULL; buffer->pool = NULL; + buffer->free = NULL; + buffer->copy = NULL; return buffer; } @@ -134,9 +140,14 @@ gst_buffer_create_sub (GstBuffer *parent, // again, for lack of better, copy parent's timestamp buffer->timestamp = parent->timestamp; + buffer->maxage = parent->maxage; // no metas, this is sane I think - buffer->metas = NULL; +// buffer->metas = NULL; + + // if the parent buffer is a subbuffer itself, use its parent, a real buffer + if (parent->parent != NULL) + parent = parent->parent; // set parentage and reference the parent buffer->parent = parent; @@ -203,7 +214,7 @@ gst_buffer_append (GstBuffer *buffer, */ void gst_buffer_destroy (GstBuffer *buffer) { - GSList *metas; +// GSList *metas; g_return_if_fail (buffer != NULL); @@ -213,10 +224,15 @@ void gst_buffer_destroy (GstBuffer *buffer) if (GST_BUFFER_DATA (buffer) && !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DONTFREE) && (buffer->parent == NULL)) { - g_free (GST_BUFFER_DATA (buffer)); -// g_print("freed data in buffer\n"); + // if there's a free function, use it + if (buffer->free != NULL) { + (buffer->free)(buffer); + } else { + g_free (GST_BUFFER_DATA (buffer)); + } } +/* DEPRACATED!!! // unreference any metadata attached to this buffer metas = buffer->metas; while (metas) { @@ -224,6 +240,7 @@ void gst_buffer_destroy (GstBuffer *buffer) metas = g_slist_next (metas); } g_slist_free (buffer->metas); +*/ // unreference the parent if there is one if (buffer->parent != NULL) @@ -332,7 +349,9 @@ gst_buffer_unref (GstBuffer *buffer) * @meta: the metadata to add to this buffer * * Add the meta data to the buffer. + * DEPRACATED!!! */ +/* DEPRACATED!!! void gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta) { @@ -342,15 +361,18 @@ gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta) gst_meta_ref (meta); buffer->metas = g_slist_append (buffer->metas,meta); } +*/ /** * gst_buffer_get_metas: * @buffer: the GstBuffer to get the metadata from * * Get the metadatas from the buffer. + * DEPRACATED!!! * * Returns: a GSList of metadata */ +/* DEPRACATED!!! GSList* gst_buffer_get_metas (GstBuffer *buffer) { @@ -358,15 +380,18 @@ gst_buffer_get_metas (GstBuffer *buffer) return buffer->metas; } +*/ /** * gst_buffer_get_first_meta: * @buffer: the GstBuffer to get the metadata from * * Get the first metadata from the buffer. + * DEPRACATED!!! * * Returns: the first metadata from the buffer */ +/* DEPRACATED!!! GstMeta* gst_buffer_get_first_meta (GstBuffer *buffer) { @@ -376,6 +401,7 @@ gst_buffer_get_first_meta (GstBuffer *buffer) return NULL; return GST_META (buffer->metas->data); } +*/ /** * gst_buffer_remove_meta: @@ -383,7 +409,9 @@ gst_buffer_get_first_meta (GstBuffer *buffer) * @meta: the metadata to remove * * Remove the given metadata from the buffer. + * DEPRACATED!!! */ +/* DEPRACATED!!! void gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta) { @@ -393,6 +421,7 @@ gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta) buffer->metas = g_slist_remove (buffer->metas, meta); gst_meta_unref (meta); } +*/ @@ -409,18 +438,29 @@ gst_buffer_copy (GstBuffer *buffer) { GstBuffer *newbuf; + // allocate a new buffer newbuf = gst_buffer_new(); - GST_BUFFER_SIZE(newbuf) = GST_BUFFER_SIZE(buffer); - GST_BUFFER_DATA(newbuf) = malloc(GST_BUFFER_SIZE(buffer)); - memcpy(GST_BUFFER_DATA(newbuf),GST_BUFFER_DATA(buffer),GST_BUFFER_SIZE(buffer)); - GST_BUFFER_MAXSIZE(newbuf) = GST_BUFFER_MAXSIZE(buffer); - GST_BUFFER_OFFSET(newbuf) = GST_BUFFER_OFFSET(buffer); - GST_BUFFER_TIMESTAMP(newbuf) = GST_BUFFER_TIMESTAMP(buffer); - GST_BUFFER_MAXAGE(newbuf) = GST_BUFFER_MAXAGE(buffer); + + // if a copy function exists, use it, else copy the bytes + if (buffer->copy != NULL) { + (buffer->copy)(buffer,newbuf); + } else { + // copy the absolute size + newbuf->size = buffer->size; + // allocate space for the copy + newbuf->data = (guchar *)g_malloc (buffer->data); + // copy the data straight across + memcpy(newbuf,buffer->data,buffer->size); + // the new maxsize is the same as the size, since we just malloc'd it + newbuf->maxsize = newbuf->size; + } + newbuf->offset = buffer->offset; + newbuf->timestamp = buffer->timestamp; + newbuf->maxage = buffer->maxage; // since we just created a new buffer, so we have no ties to old stuff - GST_BUFFER_PARENT(newbuf) = NULL; - GST_BUFFER_POOL(newbuf) = NULL; + newbuf->parent = NULL; + newbuf->pool = NULL; return newbuf; } diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h index 0c8f224f17..375c27f182 100644 --- a/gst/gstbuffer.h +++ b/gst/gstbuffer.h @@ -25,7 +25,7 @@ #define __GST_BUFFER_H__ #include -#include +//#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -80,8 +80,14 @@ typedef enum { } GstBufferFlags; + typedef struct _GstBuffer GstBuffer; + +typedef void (*GstBufferFreeFunc) (GstBuffer *buf); +typedef void (*GstBufferCopyFunc) (GstBuffer *srcbuf,GstBuffer *dstbuf); + + #include struct _GstBuffer { @@ -112,7 +118,7 @@ struct _GstBuffer { guint64 maxage; /* pointer to metadata, is really lame right now */ - GSList *metas; +// GSList *metas; /* subbuffer support, who's my parent? */ GstBuffer *parent; @@ -120,6 +126,10 @@ struct _GstBuffer { /* this is a pointer to the buffer pool (if any) */ GstBufferPool *pool; gpointer pool_private; + + /* utility function pointers */ + GstBufferFreeFunc free; // free the data associated with the buffer + GstBufferCopyFunc copy; // copy the data from one buffer to another }; /* initialisation */ @@ -146,10 +156,12 @@ void gst_buffer_destroy (GstBuffer *buffer); GstBuffer* gst_buffer_copy (GstBuffer *buffer); /* add, retrieve, and remove metadata from the buffer */ +/* DEPRACATED!!! void gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta); void gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta); GstMeta* gst_buffer_get_first_meta (GstBuffer *buffer); GSList* gst_buffer_get_metas (GstBuffer *buffer); +*/ #ifdef __cplusplus }