diff --git a/docs/gst/tmpl/gstbuffer.sgml b/docs/gst/tmpl/gstbuffer.sgml index 6df2d9d781..dec7111c35 100644 --- a/docs/gst/tmpl/gstbuffer.sgml +++ b/docs/gst/tmpl/gstbuffer.sgml @@ -15,10 +15,13 @@ neither memory space goes away. Buffers are usually created with gst_buffer_new(). After a buffer has been created one will typically allocate memory for it and set the size of the -buffer data. +buffer data. The following example creates a buffer that can hold a given +video frame with a given width, height and bits per plane. GstBuffer *buffer; - gint size, widht, height, bpp; + gint size, width, height, bpp; + + ... size = width * height * bpp; @@ -29,7 +32,8 @@ buffer data. -Alternatively, use gst_buffer_new_and_alloc() to create a buffer with preallocated +Alternatively, use gst_buffer_new_and_alloc() +to create a buffer with preallocated data of a given size. @@ -47,18 +51,30 @@ To efficiently create a smaller buffer out of an existing one, you can use gst_buffer_create_sub(). +If the plug-in wants to modify the buffer in-place, it should first obtain +a buffer that is safe to modify by using gst_buffer_copy_on_write(). This +function is optimized so that a copy will only be made when it is necessary. + + Several flags of the buffer can be set and unset with the GST_BUFFER_FLAG_SET() and GST_BUFFER_FLAG_UNSET() macros. Use GST_BUFFER_FLAG_IS_SET() to test it -a certain flag is set. +a certain #GstBufferFlag is set. Buffers can be efficiently merged into a larger buffer with gst_buffer_merge() and gst_buffer_span() if the gst_buffer_is_span_fast() function returns TRUE. +An element should either unref the buffer or push it out on a src pad +using gst_pad_push() (see #GstPad). + Buffers usually are freed by unreffing them with gst_buffer_unref(). -gst_buffer_free() can also be used to effectively free the buffer -regardless of the refcount (dangerous). +Do not use gst_buffer_free() : this function effectively frees the buffer +regardless of the refcount, which is dangerous. + + + +Last reviewed on August 30th, 2002 (0.4.0.1) @@ -71,31 +87,32 @@ regardless of the refcount (dangerous). Casts an object to a GstBuffer. -@buf: object to cast +@buf: an object to cast. +@Returns: the #GstBuffer to which the given object points. -Checks if the pointer is a GstBuffer +Checks if the pointer is a GstBuffer. -@buf: The buffer to query +@buf: a pointer to query. -Get a handle to the refcount structure of the buffer +Gets a handle to the refcount structure of the buffer. -@buf: The buffer to query +@buf: a #GstBuffer to get the refcount structure of. -Get the current refcount value of the buffer +Gets the current refcount value of the buffer. -@buf: The buffer to query +@buf: a #GstBuffer to get the refcount value of. @@ -103,7 +120,7 @@ Get the current refcount value of the buffer Calls the buffer-specific copy function on the given buffer. -@buf: a #GstBuffer to copy +@buf: a #GstBuffer to copy. @@ -111,7 +128,7 @@ Calls the buffer-specific copy function on the given buffer. Calls the buffer-specific free function on the given buffer. -@buf: a #GstBuffer to free +@buf: a #GstBuffer to free. @@ -119,16 +136,16 @@ Calls the buffer-specific free function on the given buffer. Gets the flags from this buffer. -@buf: a #GstBuffer to retrieve the flags from +@buf: a #GstBuffer to retrieve the flags from. -Gives the status of a given #GstBufferFlag. +Gives the status of a given flag of a buffer. -@buf: a #GstBuffer to query -@flag: the #GstBufferFlag to check +@buf: a #GstBuffer to query flags of. +@flag: the #GstBufferFlag to check. @@ -136,8 +153,8 @@ Gives the status of a given #GstBufferFlag. Sets a buffer flag. -@buf: a #GstBuffer to modify -@flag: the #GstBufferFlag to set +@buf: a #GstBuffer to modify flags of. +@flag: the #GstBufferFlag to set. @@ -145,8 +162,8 @@ Sets a buffer flag. Clears a buffer flag. -@buf: a #GstBuffer to modify -@flag: the #GstBufferFlag to clear +@buf: a #GstBuffer to modify flags of. +@flag: the #GstBufferFlag to clear. @@ -154,7 +171,8 @@ Clears a buffer flag. Retrieves a pointer to the data element of this buffer. -@buf: a #GstBuffer to get data pointer of +@buf: a #GstBuffer to get data pointer of. +@Returns: the pointer to the actual data contents of the buffer. @@ -162,7 +180,7 @@ Retrieves a pointer to the data element of this buffer. Gets the size of the data in this buffer. -@buf: a #GstBuffer to get data size of +@buf: a #GstBuffer to get data size of. @@ -170,7 +188,7 @@ Gets the size of the data in this buffer. Gets the maximum size of this buffer. -@buf: a #GstBuffer to get maximum size of +@buf: a #GstBuffer to get maximum size of. @@ -178,7 +196,7 @@ Gets the maximum size of this buffer. Gets the timestamp for this buffer. -@buf: a #GstBuffer to get timestamp of +@buf: a #GstBuffer to get timestamp of. @@ -186,7 +204,7 @@ Gets the timestamp for this buffer. Gets the offset in the source file of this buffer. -@buf: a #GstBuffer to get offset of +@buf: a #GstBuffer to get offset of. @@ -194,7 +212,8 @@ Gets the offset in the source file of this buffer. Gets the bufferpool for this buffer. -@buf: a #GstBuffer to get bufferpool of +@buf: a #GstBuffer to get the bufferpool of. +@Returns: the #GstBufferPool of this buffer. @@ -202,34 +221,31 @@ Gets the bufferpool for this buffer. Gets the bufferpool private data. -@buf: a #GstBuffer to get bufferpool's private data of - - -<<<<<<< gstbuffer.sgml +@buf: a #GstBuffer to get bufferpool's private data of. -This enumeration type describes the flags that can be used for a buffer. +A set of buffer flags used to describe properties of a #GstBuffer. -@GST_BUFFER_READONLY: buffer is read-only -@GST_BUFFER_SUBBUFFER: This buffer is a subbuffer, the parent buffer can be found with the - GST_BUFFER_POOL_PRIVATE() macro. -@GST_BUFFER_ORIGINAL: buffer is not a copy of another buffer -@GST_BUFFER_DONTFREE: do not try to free the data when this buffer is unreferenced -@GST_BUFFER_DISCONTINOUS: This buffer is the first one after a discontinuity in the stream -@GST_BUFFER_KEY_UNIT: This buffer holds a key unit, a unit that can be decoded independently - of other buffers -@GST_BUFFER_PREROLL: This buffer should be decoded but not rendered, it is mainly used - to resynchronise the stream -@GST_BUFFER_FLAG_LAST: Additional flags can be added starting from this flag. - -======= +@GST_BUFFER_READONLY: the buffer is read-only. +@GST_BUFFER_SUBBUFFER: the buffer is a subbuffer, the parent buffer can be + found with the GST_BUFFER_POOL_PRIVATE() macro. +@GST_BUFFER_ORIGINAL: buffer is not a copy of another buffer. +@GST_BUFFER_DONTFREE: do not try to free the data when this buffer is + unreferenced. +@GST_BUFFER_DISCONTINUOUS: the buffer is the first one after a discontinuity + in the stream. +@GST_BUFFER_KEY_UNIT: the buffer holds a key unit, a unit that can be + decoded independently of other buffers. +@GST_BUFFER_PREROLL: the buffer should be decoded but not rendered, it is + mainly used to resynchronise the stream. +@GST_BUFFER_FLAG_LAST: additional flags can be added starting from this flag. -The basic structure of a buffer +The basic structure of a buffer. @data_type: @@ -288,55 +304,58 @@ The basic structure of a buffer -Increase the refcount of the given buffer +Increases the refcount of the given buffer by one. -@buf: The buffer to refcount +@buf: a #GstBuffer to increase the refcount of. -Increase the refcount of the buffer with the given value. +Increases the refcount of the buffer by the given value. -@buf: The buffer to refcount -@c: The value to add to the refcount. +@buf: a #GstBuffer to increase the refcount of. +@c: the value to add to the refcount. -Decrease the refcount of the buffer. If the refcount reaches 0, the buffer +Decreases the refcount of the buffer. If the refcount reaches 0, the buffer will be freed. -@buf: The buffer to unref +@buf: a #GstBuffer to unref. -Copy the given buffer using the copy function of the parent GstData structure. +Copies the given buffer using the copy function of the parent GstData structure. -@buffer: The buffer to copy -@Returns: A new copy of the buffer +@buf: a #GstBuffer to copy. +@Returns: a new #GstBuffer copy of the buffer. -Copy the buffer if the refcount > 1 so that the newly created buffer can be safely -written to. If the refcount is 1, this function just returns the original buffer. +This function returns a buffer that is safe to write to. +Copy the buffer if the refcount > 1 so that the newly +created buffer can be safely written to. +If the refcount is 1, this function just returns the original buffer. -@buffer: The buffer to copy. +@buffer: a #GstBuffer to copy. +@Returns: the #GstBuffer that can safely be written to. -Free the given buffer. It is dangerous to use this function, use gst_buffer_unref() -instead. +Frees the given buffer, regardless of the refcount. +It is dangerous to use this function, you should use gst_buffer_unref() instead. -@buffer: The buffer to free. +@buffer: a #GstBuffer to free. diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index 60ed43a424..6cac03c975 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -42,17 +42,18 @@ void _gst_buffer_initialize (void) { _gst_buffer_type = g_boxed_type_register_static ("GstBuffer", - (GBoxedCopyFunc) gst_data_ref, - (GBoxedFreeFunc) gst_data_unref); + (GBoxedCopyFunc) gst_data_ref, + (GBoxedFreeFunc) gst_data_unref); _gst_buffer_pool_type = g_boxed_type_register_static ("GstBufferPool", - (GBoxedCopyFunc) gst_data_ref, - (GBoxedFreeFunc) gst_data_unref); + (GBoxedCopyFunc) gst_data_ref, + (GBoxedFreeFunc) gst_data_unref); _gst_buffer_live = 0; _gst_buffer_pool_live = 0; - chunk = gst_mem_chunk_new ("GstBufferChunk", sizeof (GstBuffer), sizeof (GstBuffer) * 200, 0); + chunk = gst_mem_chunk_new ("GstBufferChunk", sizeof (GstBuffer), + sizeof (GstBuffer) * 200, 0); GST_INFO (GST_CAT_BUFFER, "Buffers are initialized now"); } @@ -65,10 +66,10 @@ _gst_buffer_initialize (void) void gst_buffer_print_stats (void) { - g_log (g_log_domain_gstreamer, G_LOG_LEVEL_INFO, - "%d live buffer(s)", _gst_buffer_live); - g_log (g_log_domain_gstreamer, G_LOG_LEVEL_INFO, - "%d live bufferpool(s)", _gst_buffer_pool_live); + g_log (g_log_domain_gstreamer, G_LOG_LEVEL_INFO, "%d live buffer(s)", + _gst_buffer_live); + g_log (g_log_domain_gstreamer, G_LOG_LEVEL_INFO, "%d live bufferpool(s)", + _gst_buffer_pool_live); } static void @@ -97,11 +98,11 @@ _gst_buffer_sub_free (GstBuffer *buffer) /** * gst_buffer_default_free: - * @buffer: a #GstBuffer to free + * @buffer: a #GstBuffer to free. * - * Free the memory associated with the buffer including the buffer data, + * Frees the memory associated with the buffer including the buffer data, * unless the GST_BUFFER_DONTFREE flags was set or the buffer data is NULL. - * This function is used by bufferpools. + * This function is used by buffer pools. */ void gst_buffer_default_free (GstBuffer *buffer) @@ -128,12 +129,12 @@ _gst_buffer_copy_from_pool (GstBuffer *buffer) /** * gst_buffer_default_copy: - * @buffer: a #GstBuffer to make a copy of + * @buffer: a #GstBuffer to make a copy of. * * Make a full newly allocated copy of the given buffer, data and all. - * This function is used by bufferpools. + * This function is used by buffer pools. * - * Returns: new #GstBuffer + * Returns: the new #GstBuffer. */ GstBuffer* gst_buffer_default_copy (GstBuffer *buffer) @@ -144,7 +145,8 @@ gst_buffer_default_copy (GstBuffer *buffer) copy = gst_buffer_new (); /* we simply copy everything from our parent */ - GST_BUFFER_DATA (copy) = g_memdup (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); + GST_BUFFER_DATA (copy) = g_memdup (GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); GST_BUFFER_MAXSIZE (copy) = GST_BUFFER_MAXSIZE (buffer); GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); @@ -158,7 +160,7 @@ gst_buffer_default_copy (GstBuffer *buffer) * * Creates a newly allocated buffer without any data. * - * Returns: new #GstBuffer + * Returns: the new #GstBuffer. */ GstBuffer* gst_buffer_new (void) @@ -182,11 +184,11 @@ gst_buffer_new (void) /** * gst_buffer_new_and_alloc: - * @size: the size of the buffer and the memory to allocate + * @size: the size of the new buffer's data. * * Creates a newly allocated buffer with data of the given size. * - * Returns: new #GstBuffer + * Returns: the new #GstBuffer. */ GstBuffer* gst_buffer_new_and_alloc (guint size) @@ -203,13 +205,14 @@ gst_buffer_new_and_alloc (guint size) /** * gst_buffer_new_from_pool: - * @pool: the buffer pool to use - * @offset: the offset of the new buffer - * @size: the size of the new buffer + * @pool: a #GstBufferPool to use. + * @offset: the offset of the new buffer. + * @size: the size of the new buffer. * - * Creates a newly allocated buffer using the specified bufferpool, offset and size. + * Creates a newly allocated buffer using the specified buffer pool, + * offset and size. * - * Returns: new #GstBuffer + * Returns: the new #GstBuffer, or NULL if there was an error. */ GstBuffer* gst_buffer_new_from_pool (GstBufferPool *pool, guint64 offset, guint size) @@ -236,14 +239,14 @@ gst_buffer_new_from_pool (GstBufferPool *pool, guint64 offset, guint size) /** * gst_buffer_create_sub: - * @parent: parent #GstBuffer - * @offset: offset into parent #GstBuffer - * @size: size of new sub-buffer + * @parent: a parent #GstBuffer to create a subbuffer from. + * @offset: the offset into parent #GstBuffer. + * @size: the size of the new #GstBuffer sub-buffer (with size > 0). * * Creates a sub-buffer from the parent at a given offset. * This sub-buffer uses the actual memory space of the parent buffer. * - * Returns: a new #GstBuffer + * Returns: the new #GstBuffer, or NULL if there was an error. */ GstBuffer* gst_buffer_create_sub (GstBuffer *parent, guint offset, guint size) @@ -274,7 +277,8 @@ gst_buffer_create_sub (GstBuffer *parent, guint offset, guint size) buffer = gst_mem_chunk_alloc0 (chunk); _gst_buffer_live++; - /* make sure nobody overwrites data in the new buffer by setting the READONLY flag */ + /* make sure nobody overwrites data in the new buffer + * by setting the READONLY flag */ _GST_DATA_INIT (GST_DATA (buffer), _gst_buffer_type, GST_DATA_FLAG_SHIFT (GST_BUFFER_SUBBUFFER) | @@ -297,8 +301,8 @@ gst_buffer_create_sub (GstBuffer *parent, guint offset, guint size) /** * gst_buffer_merge: - * @buf1: first source #GstBuffer to merge - * @buf2: second source #GstBuffer to merge + * @buf1: a first source #GstBuffer to merge. + * @buf2: the second source #GstBuffer to merge. * * Create a new buffer that is the concatenation of the two source * buffers. The original source buffers will not be modified or @@ -307,7 +311,7 @@ gst_buffer_create_sub (GstBuffer *parent, guint offset, guint size) * Internally is nothing more than a specialized gst_buffer_span(), * so the same optimizations can occur. * - * Returns: a new #GstBuffer that's the concatenation of the source buffers + * Returns: the new #GstBuffer that's the concatenation of the source buffers. */ GstBuffer* gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2) @@ -321,13 +325,14 @@ gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2) /** * gst_buffer_is_span_fast: - * @buf1: first source buffer - * @buf2: second source buffer + * @buf1: a first source #GstBuffer. + * @buf2: the second source #GstBuffer. * * Determines whether a gst_buffer_span() is free (as in free beer), * or requires a memcpy. * - * Returns: TRUE if the buffers are contiguous, FALSE if a copy would be required. + * Returns: TRUE if the buffers are contiguous, + * FALSE if a copy would be required. */ gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2) @@ -344,10 +349,11 @@ gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2) /** * gst_buffer_span: - * @buf1: first source #GstBuffer to merge - * @offset: offset in first buffer to start new buffer - * @buf2: second source #GstBuffer to merge - * @len: length of new buffer + * @buf1: a first source #GstBuffer to merge. + * @offset: the offset in the first buffer from where the new + * buffer should start. + * @buf2: the second source #GstBuffer to merge. + * @len: the total length of the new buffer. * * Creates a new buffer that consists of part of buf1 and buf2. * Logically, buf1 and buf2 are concatenated into a single larger @@ -359,7 +365,7 @@ gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2) * parent, and thus no copying is necessary. you can use * gst_buffer_is_span_fast() to determine if a memcpy will be needed. * - * Returns: a new #GstBuffer that spans the two source buffers + * Returns: the new #GstBuffer that spans the two source buffers. */ GstBuffer* gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len) @@ -374,10 +380,13 @@ gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len) if (gst_buffer_is_span_fast (buf1, buf2)) { GstBuffer *parent = GST_BUFFER (buf1->pool_private); /* we simply create a subbuffer of the common parent */ - newbuf = gst_buffer_create_sub (parent, buf1->data - parent->data + offset, len); + newbuf = gst_buffer_create_sub (parent, + buf1->data - parent->data + offset, len); } else { - GST_DEBUG (GST_CAT_BUFFER,"slow path taken while spanning buffers %p and %p", buffer, append); + GST_DEBUG (GST_CAT_BUFFER, + "slow path taken while spanning buffers %p and %p", + buffer, append); /* otherwise we simply have to brute-force copy the buffers */ newbuf = gst_buffer_new_and_alloc (len); @@ -387,7 +396,8 @@ gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len) /* copy the first buffer's data across */ memcpy (newbuf->data, buf1->data + offset, buf1->size - offset); /* copy the second buffer's data across */ - memcpy (newbuf->data + (buf1->size - offset), buf2->data, len - (buf1->size - offset)); + memcpy (newbuf->data + (buf1->size - offset), buf2->data, + len - (buf1->size - offset)); } /* if the offset is 0, the new buffer has the same timestamp as buf1 */ if (offset == 0) @@ -406,16 +416,19 @@ gst_buffer_pool_default_free (GstBufferPool *pool) /** * gst_buffer_pool_new: - * @free: The function to free the bufferpool - * @copy: The function to copy the bufferpool - * @buffer_new: the function to create a new buffer from this pool - * @buffer_copy: the function to copy a buffer from this pool - * @buffer_free: the function to free a buffer in this pool - * @user_data: user data passed to buffer_* functions + * @free: the #GstDataFreeFunction to free the buffer pool. + * @copy: the #GstDataCopyFunction to copy the buffer pool. + * @buffer_new: the #GstBufferPoolBufferNewFunction to create a new buffer + * from this pool + * @buffer_copy: the #GstBufferPoolBufferCopyFunction to copy a buffer + * from this pool + * @buffer_free: the #GstBufferPoolBufferFreeFunction to free a buffer + * in this pool + * @user_data: the user data gpointer passed to buffer_* functions. * - * Create a new bufferpool with the given functions. + * Creates a new buffer pool with the given functions. * - * Returns: a new GstBufferPool or NULL on error. + * Returns: a new #GstBufferPool, or NULL on error. */ GstBufferPool* gst_buffer_pool_new (GstDataFreeFunction free, @@ -453,9 +466,9 @@ gst_buffer_pool_new (GstDataFreeFunction free, /** * gst_buffer_pool_is_active: - * @pool: the pool to query + * @pool: the #GstBufferPool to query. * - * Query if the geven bufferpool is active. + * Queries if the given buffer pool is active. * * Returns: TRUE if the pool is active. */ @@ -467,11 +480,11 @@ gst_buffer_pool_is_active (GstBufferPool *pool) /** * gst_buffer_pool_set_active: - * @pool: the pool to activate - * @active: new status of the pool + * @pool: a #GstBufferPool to set the activity status on. + * @active: the new status of the pool. * - * Set the given pool to the active or inactive state depending on the - * activate parameter + * Sets the given pool to the active or inactive state depending on the + * active parameter. */ void gst_buffer_pool_set_active (GstBufferPool *pool, gboolean active) @@ -481,10 +494,10 @@ gst_buffer_pool_set_active (GstBufferPool *pool, gboolean active) /** * gst_buffer_pool_set_user_data: - * @pool: the pool set the user data for - * @user_data: the user_data to set + * @pool: the #GstBufferPool to set the user data for. + * @user_data: the user_data to set on the buffer pool. * - * Set the given user data to the bufferpool + * Sets the given user data on the buffer pool. */ void gst_buffer_pool_set_user_data (GstBufferPool *pool, gpointer user_data) @@ -494,11 +507,11 @@ gst_buffer_pool_set_user_data (GstBufferPool *pool, gpointer user_data) /** * gst_buffer_pool_get_user_data: - * @pool: the pool get the user data for + * @pool: the #GstBufferPool to get the user data for. * - * Get the user data of the bufferpool + * Gets the user data of the buffer pool. * - * Returns: the user data associated with this bufferpool + * Returns: the user data associated with this buffer pool. */ gpointer gst_buffer_pool_get_user_data (GstBufferPool *pool)