* @size: the size to fill
*
* Copy @size bytes from @src to @buffer at @offset.
+ *
+ * Returns: The amount of bytes copied. This value can be lower than @size
+ * when @buffer did not contain enough data.
*/
-void
+gsize
gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
gsize size)
{
- gsize i, len;
+ gsize i, len, left;
const guint8 *ptr = src;
- g_return_if_fail (GST_IS_BUFFER (buffer));
- g_return_if_fail (gst_buffer_is_writable (buffer));
- g_return_if_fail (src != NULL);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), 0);
+ g_return_val_if_fail (src != NULL, 0);
len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
- for (i = 0; i < len && size > 0; i++) {
+ for (i = 0; i < len && left > 0; i++) {
guint8 *data;
gsize ssize, tocopy;
GstMemory *mem;
data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE);
if (ssize > offset) {
/* we have enough */
- tocopy = MIN (ssize - offset, size);
+ tocopy = MIN (ssize - offset, left);
memcpy (data + offset, ptr, tocopy);
- size -= tocopy;
+ left -= tocopy;
ptr += tocopy;
offset = 0;
} else {
}
gst_memory_unmap (mem, data, ssize);
}
+ return size - left;
}
/**
* @size: the size to extract
*
* Copy @size bytes starting from @offset in @buffer to @dest.
+ *
+ * Returns: The amount of bytes extracted. This value can be lower than @size
+ * when @buffer did not contain enough data.
*/
-void
+gsize
gst_buffer_extract (GstBuffer * buffer, gsize offset, gpointer dest, gsize size)
{
- gsize i, len;
+ gsize i, len, left;
guint8 *ptr = dest;
- g_return_if_fail (GST_IS_BUFFER (buffer));
- g_return_if_fail (dest != NULL);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (dest != NULL, 0);
len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
- for (i = 0; i < len && size > 0; i++) {
+ for (i = 0; i < len && left > 0; i++) {
guint8 *data;
gsize ssize, tocopy;
GstMemory *mem;
data = gst_memory_map (mem, &ssize, NULL, GST_MAP_READ);
if (ssize > offset) {
/* we have enough */
- tocopy = MIN (ssize - offset, size);
+ tocopy = MIN (ssize - offset, left);
memcpy (ptr, data + offset, tocopy);
- size -= tocopy;
+ left -= tocopy;
ptr += tocopy;
offset = 0;
} else {
}
gst_memory_unmap (mem, data, ssize);
}
+ return size - left;
}
/**
* @size: the size to set
*
* Fill @buf with @size bytes with @val starting from @offset.
+ *
+ * Returns: The amount of bytes filled. This value can be lower than @size
+ * when @buffer did not contain enough data.
*/
-void
+gsize
gst_buffer_memset (GstBuffer * buffer, gsize offset, guint8 val, gsize size)
{
- gsize i, len;
+ gsize i, len, left;
- g_return_if_fail (GST_IS_BUFFER (buffer));
- g_return_if_fail (gst_buffer_is_writable (buffer));
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), 0);
len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
- for (i = 0; i < len && size > 0; i++) {
+ for (i = 0; i < len && left > 0; i++) {
guint8 *data;
gsize ssize, toset;
GstMemory *mem;
data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE);
if (ssize > offset) {
/* we have enough */
- toset = MIN (ssize - offset, size);
+ toset = MIN (ssize - offset, left);
memset (data + offset, val, toset);
- size -= toset;
+ left -= toset;
offset = 0;
} else {
/* offset past buffer, skip */
}
gst_memory_unmap (mem, data, ssize);
}
+ return size - left;
}
/**
*/
#define gst_buffer_remove_memory(b,i) gst_buffer_remove_memory_range ((b), (i), 1)
-void gst_buffer_fill (GstBuffer *buffer, gsize offset,
+gsize gst_buffer_fill (GstBuffer *buffer, gsize offset,
gconstpointer src, gsize size);
-void gst_buffer_extract (GstBuffer *buffer, gsize offset,
+gsize gst_buffer_extract (GstBuffer *buffer, gsize offset,
gpointer dest, gsize size);
gint gst_buffer_memcmp (GstBuffer *buffer, gsize offset,
gconstpointer mem, gsize size);
-void gst_buffer_memset (GstBuffer *buffer, gsize offset,
+gsize gst_buffer_memset (GstBuffer *buffer, gsize offset,
guint8 val, gsize size);
gsize gst_buffer_get_sizes (GstBuffer *buffer, gsize *offset, gsize *maxsize);