From e694f5e71cfae1b5d2a6cc925a0c4732cb284343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Stadler?= Date: Wed, 23 Nov 2011 11:03:19 +0100 Subject: [PATCH] bytewriter: add method to write out a buffer In 0.10, this can be done with a one-liner by using GST_BUFFER_DATA/SIZE with put_data. A 0.11 user has to resort to gst_buffer_map, which is less convenient and might require a memcpy internally. API: gst_byte_writer_put_buffer() --- libs/gst/base/gstbytewriter.c | 39 +++++++++++++++++++++++++++++++++++ libs/gst/base/gstbytewriter.h | 1 + 2 files changed, 40 insertions(+) diff --git a/libs/gst/base/gstbytewriter.c b/libs/gst/base/gstbytewriter.c index 969b705143..e71730094a 100644 --- a/libs/gst/base/gstbytewriter.c +++ b/libs/gst/base/gstbytewriter.c @@ -750,3 +750,42 @@ CREATE_WRITE_STRING_FUNC (32, guint32); * * Since: 0.10.27 */ + +/** + * gst_byte_writer_put_buffer: + * @writer: #GstByteWriter instance + * @buffer: (transfer none): source #GstBuffer + * @offset: offset to copy from + * @size: total size to copy. If -1, all data is copied + * + * Writes @size bytes of @data to @writer. + * + * Returns: %TRUE if the data could be written + * + */ +gboolean +gst_byte_writer_put_buffer (GstByteWriter * writer, GstBuffer * buffer, + gsize offset, gssize size) +{ + g_return_val_if_fail (writer != NULL, FALSE); + g_return_val_if_fail (size >= -1, FALSE); + + if (size == -1) { + size = gst_buffer_get_size (buffer); + + if (offset >= (gsize) size) + return TRUE; + + size -= offset; + } + + if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline (writer, size))) + return FALSE; + + gst_buffer_extract (buffer, offset, + (guint8 *) & writer->parent.data[writer->parent.byte], size); + writer->parent.byte += size; + writer->parent.size = MAX (writer->parent.size, writer->parent.byte); + + return TRUE; +} diff --git a/libs/gst/base/gstbytewriter.h b/libs/gst/base/gstbytewriter.h index d374ed7d9f..644a78f9ac 100644 --- a/libs/gst/base/gstbytewriter.h +++ b/libs/gst/base/gstbytewriter.h @@ -152,6 +152,7 @@ gboolean gst_byte_writer_fill (GstByteWriter *writer, guint8 gboolean gst_byte_writer_put_string_utf8 (GstByteWriter *writer, const gchar *data); gboolean gst_byte_writer_put_string_utf16 (GstByteWriter *writer, const guint16 *data); gboolean gst_byte_writer_put_string_utf32 (GstByteWriter *writer, const guint32 *data); +gboolean gst_byte_writer_put_buffer (GstByteWriter *writer, GstBuffer * buffer, gsize offset, gssize size); /** * gst_byte_writer_put_string: