bytewriter: Add unchecked/inline variant of gst_byte_writer_put_buffer()
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 29 Mar 2012 15:59:28 +0000 (17:59 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 29 Mar 2012 16:01:11 +0000 (18:01 +0200)
libs/gst/base/gstbytewriter.h

index 4f5da70..72da716 100644 (file)
@@ -300,6 +300,49 @@ _gst_byte_writer_fill_inline (GstByteWriter * writer, guint8 value, guint size)
   return TRUE;
 }
 
+static inline void
+gst_byte_writer_put_buffer_unchecked (GstByteWriter * writer, GstBuffer * buffer,
+    gsize offset, gssize size)
+{
+  if (size == -1) {
+    size = gst_buffer_get_size (buffer);
+
+    if (offset >= (gsize) size)
+      return;
+
+    size -= offset;
+  }
+
+  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);
+}
+
+static inline gboolean
+_gst_byte_writer_put_buffer_inline (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_byte_writer_put_buffer_unchecked (writer, buffer, offset, size);
+
+  return TRUE;
+}
+
 #ifndef GST_BYTE_WRITER_DISABLE_INLINES
 
 /* we use defines here so we can add the G_LIKELY() */
@@ -356,6 +399,8 @@ _gst_byte_writer_fill_inline (GstByteWriter * writer, guint8 value, guint size)
     G_LIKELY (_gst_byte_writer_put_data_inline (writer, data, size))
 #define gst_byte_writer_fill(writer, val, size) \
     G_LIKELY (_gst_byte_writer_fill_inline (writer, val, size))
+#define gst_byte_writer_put_buffer(writer, buffer, offset, size) \
+    G_LIKELY (_gst_byte_writer_put_buffer_inline (writer, buffer, offset, size))
 
 #endif