Buffer
Object Hierarchy:
Description:
public class Buffer :
MiniObject
Buffers are the basic unit of data transfer in GStreamer. The Buffer type provides all the
state necessary to define a region of memory as part of a stream. Sub-buffers are also supported, allowing a smaller region of a buffer to
become its own buffer, with mechanisms in place to ensure that neither memory space goes away prematurely. Buffers are usually created
with Buffer. After a buffer has been created one will typically allocate
memory for it and set the size of the buffer data. The following example creates a buffer that can hold a given video frame with a given
width, height and bits per plane.
Creating a buffer for a video frame:
GstBuffer *buffer;
gint size, width, height, bpp;
...
size = width * height * bpp;
buffer = gst_buffer_new ();
GST_BUFFER_SIZE (buffer) = size;
GST_BUFFER_MALLOCDATA (buffer) = g_malloc (size);
GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer);
...
Alternatively, use Buffer.and_alloc to create a buffer with
preallocated data of a given size. The data pointed to by the buffer can be retrieved with the GST_BUFFER_DATA macro. The
size of the data can be found with GST_BUFFER_SIZE. For buffers of size 0, the data pointer is undefined (usually NULL) and
should never be used. If an element knows what pad you will push the buffer out on, it should use
alloc_buffer instead to create a buffer. This allows downstream elements to provide
special buffers to write in, like hardware buffers. A buffer has a pointer to a Caps describing
the media type of the data in the buffer. Attach caps to the buffer with set_caps;
this is typically done before pushing out a buffer using push so that the downstream
element knows the type of the buffer. A buffer will usually have a timestamp, and a duration, but neither of these are guaranteed (they
may be set to CLOCK_TIME_NONE). Whenever a meaningful value can be given for
these, they should be set. The timestamp and duration are measured in nanoseconds (they are
ClockTime values). A buffer can also have one or both of a start and an end offset. These are media-type specific. For video
buffers, the start offset will generally be the frame number. For audio buffers, it will be the number of samples produced so far. For
compressed data, it could be the byte offset in a source or destination file. Likewise, the end offset will be the offset of the end of
the buffer. These can only be meaningfully interpreted if you know the media type of the buffer (the
Caps set on it). Either or both can be set to
BUFFER_OFFSET_NONE. ref is
used to increase the refcount of a buffer. This must be done when you want to keep a handle to the buffer after pushing it to the next
element. To efficiently create a smaller buffer out of an existing one, you can use
create_sub. If a plug-in wants to modify the buffer data in-place, it should first obtain a buffer that is safe to modify by using
make_writable. This function is optimized so that a copy will only be made when
it is necessary. A plugin that only wishes to modify the metadata of a buffer, such as the offset, timestamp or caps, should use
make_metadata_writable, which will create a subbuffer of the original
buffer to ensure the caller has sole ownership, and not copy the buffer data. Several flags of the buffer can be set and unset with the
flag_set and flag_unset
macros. Use flag_is_set to test if a certain
BufferFlag is set. Buffers can be efficiently merged into a larger buffer with
merge and span if the
is_span_fast function returns TRUE. An element should either unref the buffer or
push it out on a src pad using push (see Pad).
Buffers are usually freed by unreffing them with unref. When the refcount drops to 0,
any data pointed to by GST_BUFFER_MALLOCDATA will also be freed. Last reviewed on August 11th, 2006 (0.10.10)
Namespace: Gst
Package: gstreamer-0.10
Content:
Static methods:
-
public static void replace (ref Buffer? oldobj, Buffer? newobj)
-
public static Buffer? try_new_and_alloc (uint size)
Tries to create a newly allocated buffer with data of the given size. If the requested amount of memory
can't be allocated, NULL will be returned. The buffer memory is not cleared. Note that when size == 0, the buffer data
pointer will be NULL. MT safe. be allocated.
Creation methods:
Methods:
-
public Buffer copy ()
-
public void copy_metadata (Buffer src, BufferCopyFlags flags)
Copies the metadata from src into dest. The data, size and mallocdata fields
are not copied. all the metadata fields. This function is typically called from a custom buffer copy function after creating
dest and setting the data, size, mallocdata.
-
public Buffer create_sub (uint offset, uint size)
Creates a sub-buffer from parent at offset and size. This
sub-buffer uses the actual memory space of the parent buffer. This function will copy the offset and timestamp fields when the offset
is 0. If not, they will be set to CLOCK_TIME_NONE and
BUFFER_OFFSET_NONE. If offset equals 0 and size
equals the total size of buffer, the duration and offset end fields are also copied. If not they will be set to
CLOCK_TIME_NONE and
BUFFER_OFFSET_NONE. MT safe. invalid.
-
public bool duration_is_valid ()
-
public bool flag_is_set (BufferFlag flag)
-
public void flag_set (BufferFlag flag)
-
public void flag_unset (BufferFlag flag)
-
public Caps get_caps ()
Gets the media type of the buffer. This can be NULL if there is no media type attached to this buffer.
Returns NULL if there were no caps on this buffer.
-
public bool is_discont ()
-
public bool is_metadata_writable ()
Similar to gst_buffer_is_writable, but this only ensures that the refcount of the buffer is 1,
indicating that the caller is the sole owner and can change the buffer metadata, such as caps and timestamps.
-
public bool is_span_fast (Buffer buf2)
Determines whether a span can be done without copying
the contents, that is, whether the data areas are contiguous sub-buffers of the same buffer. MT safe. FALSE if a copy would be
required.
-
public void join (owned Buffer buf2)
Create a new buffer that is the concatenation of the two source buffers, and unrefs the original source
buffers. If the buffers point to contiguous areas of memory, the buffer is created without copying the data. This is a convenience
function for C programmers. See also merge, which does the same thing without
unreffing the input parameters. Language bindings without explicit reference counting should not wrap this function. the source
buffers.
-
public void make_metadata_writable ()
Similar to gst_buffer_make_writable, but does not ensure that the buffer data array is writable.
Instead, this just ensures that the returned buffer is solely owned by the caller, by creating a subbuffer of the original buffer if
necessary. After calling this function, buf should not be referenced anymore. The result of this function has guaranteed
writable metadata. may or may not be the same as buf.
-
public void make_writable ()
-
public Buffer merge (Buffer buf2)
Create a new buffer that is the concatenation of the two source buffers. The original source buffers
will not be modified or unref'd. Make sure you unref the source buffers if they are not used anymore afterwards. If the buffers point
to contiguous areas of memory, the buffer is created without copying the data. of the source buffers.
-
public bool offset_end_is_valid ()
-
public bool offset_is_valid ()
-
public weak Buffer ref ()
-
public void set_caps (Caps caps)
Sets the media type on the buffer. The refcount of the caps will be increased and any previous caps on
the buffer will be unreffed.
-
public Buffer span (uint32 offset, Buffer buf2, uint32 len)
Creates a new buffer that consists of part of buf1 and buf2. Logically, buf1 and buf2 are concatenated
into a single larger buffer, and a new buffer is created at the given offset inside this space, with a given length. If the two source
buffers are children of the same larger buffer, and are contiguous, the new buffer will be a child of the shared parent, and thus no
copying is necessary. you can use is_span_fast to determine if a memcpy will
be needed. MT safe. buffers, or NULL if the arguments are invalid.
-
public void stamp (Buffer src)
Copies additional information (the timestamp, duration, and offset start and end) from one buffer to the
other. This function does not copy any buffer flags or caps and is equivalent to gst_buffer_copy_metadata(@dest, src,
GST_BUFFER_COPY_TIMESTAMPS). control.
-
public bool timestamp_is_valid ()
-
public void unref ()
Fields: