bytewriter: add method to write out a buffer
authorRené Stadler <rene.stadler@collabora.co.uk>
Wed, 23 Nov 2011 10:03:19 +0000 (11:03 +0100)
committerRené Stadler <rene.stadler@collabora.co.uk>
Wed, 23 Nov 2011 10:04:00 +0000 (11:04 +0100)
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
libs/gst/base/gstbytewriter.h

index 969b705..e717300 100644 (file)
@@ -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;
+}
index d374ed7..644a78f 100644 (file)
@@ -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: