- 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
This commit is contained in:
Erik Walthinsen 2001-04-24 19:20:15 +00:00
parent 09588296ae
commit 76cfe49b5e
2 changed files with 71 additions and 19 deletions

View file

@ -33,8 +33,13 @@ static GMutex *_gst_buffer_chunk_lock;
void void
_gst_buffer_initialize (void) _gst_buffer_initialize (void)
{ {
_gst_buffer_chunk = g_mem_chunk_new ("GstBuffer", sizeof(GstBuffer), buffersize = sizeof(GstBuffer);
sizeof(GstBuffer) * 16, G_ALLOC_AND_FREE);
// 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 (); _gst_buffer_chunk_lock = g_mutex_new ();
} }
@ -56,7 +61,6 @@ gst_buffer_new(void)
g_mutex_unlock (_gst_buffer_chunk_lock); g_mutex_unlock (_gst_buffer_chunk_lock);
GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer); GST_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer);
// g_print("allocating new mutex\n");
buffer->lock = g_mutex_new (); buffer->lock = g_mutex_new ();
#ifdef HAVE_ATOMIC_H #ifdef HAVE_ATOMIC_H
atomic_set (&buffer->refcount, 1); atomic_set (&buffer->refcount, 1);
@ -69,9 +73,11 @@ gst_buffer_new(void)
buffer->maxsize = 0; buffer->maxsize = 0;
buffer->offset = 0; buffer->offset = 0;
buffer->timestamp = 0; buffer->timestamp = 0;
buffer->metas = NULL; // buffer->metas = NULL;
buffer->parent = NULL; buffer->parent = NULL;
buffer->pool = NULL; buffer->pool = NULL;
buffer->free = NULL;
buffer->copy = NULL;
return buffer; return buffer;
} }
@ -134,9 +140,14 @@ gst_buffer_create_sub (GstBuffer *parent,
// again, for lack of better, copy parent's timestamp // again, for lack of better, copy parent's timestamp
buffer->timestamp = parent->timestamp; buffer->timestamp = parent->timestamp;
buffer->maxage = parent->maxage;
// no metas, this is sane I think // 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 // set parentage and reference the parent
buffer->parent = parent; buffer->parent = parent;
@ -203,7 +214,7 @@ gst_buffer_append (GstBuffer *buffer,
*/ */
void gst_buffer_destroy (GstBuffer *buffer) void gst_buffer_destroy (GstBuffer *buffer)
{ {
GSList *metas; // GSList *metas;
g_return_if_fail (buffer != NULL); g_return_if_fail (buffer != NULL);
@ -213,10 +224,15 @@ void gst_buffer_destroy (GstBuffer *buffer)
if (GST_BUFFER_DATA (buffer) && if (GST_BUFFER_DATA (buffer) &&
!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DONTFREE) && !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DONTFREE) &&
(buffer->parent == NULL)) { (buffer->parent == NULL)) {
// if there's a free function, use it
if (buffer->free != NULL) {
(buffer->free)(buffer);
} else {
g_free (GST_BUFFER_DATA (buffer)); g_free (GST_BUFFER_DATA (buffer));
// g_print("freed data in buffer\n"); }
} }
/* DEPRACATED!!!
// unreference any metadata attached to this buffer // unreference any metadata attached to this buffer
metas = buffer->metas; metas = buffer->metas;
while (metas) { while (metas) {
@ -224,6 +240,7 @@ void gst_buffer_destroy (GstBuffer *buffer)
metas = g_slist_next (metas); metas = g_slist_next (metas);
} }
g_slist_free (buffer->metas); g_slist_free (buffer->metas);
*/
// unreference the parent if there is one // unreference the parent if there is one
if (buffer->parent != NULL) if (buffer->parent != NULL)
@ -332,7 +349,9 @@ gst_buffer_unref (GstBuffer *buffer)
* @meta: the metadata to add to this buffer * @meta: the metadata to add to this buffer
* *
* Add the meta data to the buffer. * Add the meta data to the buffer.
* DEPRACATED!!!
*/ */
/* DEPRACATED!!!
void void
gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta) gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta)
{ {
@ -342,15 +361,18 @@ gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta)
gst_meta_ref (meta); gst_meta_ref (meta);
buffer->metas = g_slist_append (buffer->metas,meta); buffer->metas = g_slist_append (buffer->metas,meta);
} }
*/
/** /**
* gst_buffer_get_metas: * gst_buffer_get_metas:
* @buffer: the GstBuffer to get the metadata from * @buffer: the GstBuffer to get the metadata from
* *
* Get the metadatas from the buffer. * Get the metadatas from the buffer.
* DEPRACATED!!!
* *
* Returns: a GSList of metadata * Returns: a GSList of metadata
*/ */
/* DEPRACATED!!!
GSList* GSList*
gst_buffer_get_metas (GstBuffer *buffer) gst_buffer_get_metas (GstBuffer *buffer)
{ {
@ -358,15 +380,18 @@ gst_buffer_get_metas (GstBuffer *buffer)
return buffer->metas; return buffer->metas;
} }
*/
/** /**
* gst_buffer_get_first_meta: * gst_buffer_get_first_meta:
* @buffer: the GstBuffer to get the metadata from * @buffer: the GstBuffer to get the metadata from
* *
* Get the first metadata from the buffer. * Get the first metadata from the buffer.
* DEPRACATED!!!
* *
* Returns: the first metadata from the buffer * Returns: the first metadata from the buffer
*/ */
/* DEPRACATED!!!
GstMeta* GstMeta*
gst_buffer_get_first_meta (GstBuffer *buffer) gst_buffer_get_first_meta (GstBuffer *buffer)
{ {
@ -376,6 +401,7 @@ gst_buffer_get_first_meta (GstBuffer *buffer)
return NULL; return NULL;
return GST_META (buffer->metas->data); return GST_META (buffer->metas->data);
} }
*/
/** /**
* gst_buffer_remove_meta: * gst_buffer_remove_meta:
@ -383,7 +409,9 @@ gst_buffer_get_first_meta (GstBuffer *buffer)
* @meta: the metadata to remove * @meta: the metadata to remove
* *
* Remove the given metadata from the buffer. * Remove the given metadata from the buffer.
* DEPRACATED!!!
*/ */
/* DEPRACATED!!!
void void
gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta) 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); buffer->metas = g_slist_remove (buffer->metas, meta);
gst_meta_unref (meta); gst_meta_unref (meta);
} }
*/
@ -409,18 +438,29 @@ gst_buffer_copy (GstBuffer *buffer)
{ {
GstBuffer *newbuf; GstBuffer *newbuf;
// allocate a new buffer
newbuf = gst_buffer_new(); newbuf = gst_buffer_new();
GST_BUFFER_SIZE(newbuf) = GST_BUFFER_SIZE(buffer);
GST_BUFFER_DATA(newbuf) = malloc(GST_BUFFER_SIZE(buffer)); // if a copy function exists, use it, else copy the bytes
memcpy(GST_BUFFER_DATA(newbuf),GST_BUFFER_DATA(buffer),GST_BUFFER_SIZE(buffer)); if (buffer->copy != NULL) {
GST_BUFFER_MAXSIZE(newbuf) = GST_BUFFER_MAXSIZE(buffer); (buffer->copy)(buffer,newbuf);
GST_BUFFER_OFFSET(newbuf) = GST_BUFFER_OFFSET(buffer); } else {
GST_BUFFER_TIMESTAMP(newbuf) = GST_BUFFER_TIMESTAMP(buffer); // copy the absolute size
GST_BUFFER_MAXAGE(newbuf) = GST_BUFFER_MAXAGE(buffer); 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 // since we just created a new buffer, so we have no ties to old stuff
GST_BUFFER_PARENT(newbuf) = NULL; newbuf->parent = NULL;
GST_BUFFER_POOL(newbuf) = NULL; newbuf->pool = NULL;
return newbuf; return newbuf;
} }

View file

@ -25,7 +25,7 @@
#define __GST_BUFFER_H__ #define __GST_BUFFER_H__
#include <gst/gstobject.h> #include <gst/gstobject.h>
#include <gst/gstmeta.h> //#include <gst/gstmeta.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
@ -80,8 +80,14 @@ typedef enum {
} GstBufferFlags; } GstBufferFlags;
typedef struct _GstBuffer GstBuffer; typedef struct _GstBuffer GstBuffer;
typedef void (*GstBufferFreeFunc) (GstBuffer *buf);
typedef void (*GstBufferCopyFunc) (GstBuffer *srcbuf,GstBuffer *dstbuf);
#include <gst/gstbufferpool.h> #include <gst/gstbufferpool.h>
struct _GstBuffer { struct _GstBuffer {
@ -112,7 +118,7 @@ struct _GstBuffer {
guint64 maxage; guint64 maxage;
/* pointer to metadata, is really lame right now */ /* pointer to metadata, is really lame right now */
GSList *metas; // GSList *metas;
/* subbuffer support, who's my parent? */ /* subbuffer support, who's my parent? */
GstBuffer *parent; GstBuffer *parent;
@ -120,6 +126,10 @@ struct _GstBuffer {
/* this is a pointer to the buffer pool (if any) */ /* this is a pointer to the buffer pool (if any) */
GstBufferPool *pool; GstBufferPool *pool;
gpointer pool_private; 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 */ /* initialisation */
@ -146,10 +156,12 @@ void gst_buffer_destroy (GstBuffer *buffer);
GstBuffer* gst_buffer_copy (GstBuffer *buffer); GstBuffer* gst_buffer_copy (GstBuffer *buffer);
/* add, retrieve, and remove metadata from the buffer */ /* add, retrieve, and remove metadata from the buffer */
/* DEPRACATED!!!
void gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta); void gst_buffer_add_meta (GstBuffer *buffer, GstMeta *meta);
void gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta); void gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta);
GstMeta* gst_buffer_get_first_meta (GstBuffer *buffer); GstMeta* gst_buffer_get_first_meta (GstBuffer *buffer);
GSList* gst_buffer_get_metas (GstBuffer *buffer); GSList* gst_buffer_get_metas (GstBuffer *buffer);
*/
#ifdef __cplusplus #ifdef __cplusplus
} }