From 8074f6687dc566fa2cd8c904acbcb7897c89930a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 18 May 2005 09:55:43 +0000 Subject: [PATCH] gst/base/: Ported and added adapter to the base classes. Original commit message from CVS: * gst/base/Makefile.am: * gst/base/gstadapter.c: (gst_adapter_base_init), (gst_adapter_class_init), (gst_adapter_init), (gst_adapter_dispose), (gst_adapter_finalize), (gst_adapter_new), (gst_adapter_clear), (gst_adapter_push), (gst_adapter_peek), (gst_adapter_flush), (gst_adapter_available), (gst_adapter_available_fast): * gst/base/gstadapter.h: Ported and added adapter to the base classes. --- ChangeLog | 12 +++ gst/base/Makefile.am | 2 + gst/base/gstadapter.c | 257 +++++++++++++++++++++++++++++++++++++++++++++ gst/base/gstadapter.h | 75 +++++++++++++ libs/gst/base/Makefile.am | 2 + libs/gst/base/gstadapter.c | 257 +++++++++++++++++++++++++++++++++++++++++++++ libs/gst/base/gstadapter.h | 75 +++++++++++++ 7 files changed, 680 insertions(+) create mode 100644 gst/base/gstadapter.c create mode 100644 gst/base/gstadapter.h create mode 100644 libs/gst/base/gstadapter.c create mode 100644 libs/gst/base/gstadapter.h diff --git a/ChangeLog b/ChangeLog index c2f5b8a..0b71db1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-05-18 Wim Taymans + + * gst/base/Makefile.am: + * gst/base/gstadapter.c: (gst_adapter_base_init), + (gst_adapter_class_init), (gst_adapter_init), + (gst_adapter_dispose), (gst_adapter_finalize), (gst_adapter_new), + (gst_adapter_clear), (gst_adapter_push), (gst_adapter_peek), + (gst_adapter_flush), (gst_adapter_available), + (gst_adapter_available_fast): + * gst/base/gstadapter.h: + Ported and added adapter to the base classes. + 2005-05-17 Thomas Vander Stichele * gst/gst.c: diff --git a/gst/base/Makefile.am b/gst/base/Makefile.am index 9037e1b..a921189 100644 --- a/gst/base/Makefile.am +++ b/gst/base/Makefile.am @@ -3,6 +3,7 @@ lib_LTLIBRARIES = libgstbase-@GST_MAJORMINOR@.la libgstbase_@GST_MAJORMINOR@_la_DEPENDENCIES = \ ../libgstreamer-@GST_MAJORMINOR@.la libgstbase_@GST_MAJORMINOR@_la_SOURCES = \ + gstadapter.c \ gstbasesink.c \ gstbasesrc.c \ gstbasetransform.c \ @@ -19,6 +20,7 @@ libgstbase_@GST_MAJORMINOR@includedir = \ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/base libgstbase_@GST_MAJORMINOR@include_HEADERS = \ + gstadapter.h \ gstbasesink.h \ gstbasesrc.h \ gstbasetransform.h \ diff --git a/gst/base/gstadapter.c b/gst/base/gstadapter.c new file mode 100644 index 0000000..993c78c --- /dev/null +++ b/gst/base/gstadapter.c @@ -0,0 +1,257 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include "gstadapter.h" + +/* default size for the assembled data buffer */ +#define DEFAULT_SIZE 16 + +GST_DEBUG_CATEGORY_STATIC (gst_adapter_debug); +#define GST_CAT_DEFAULT gst_adapter_debug + +#define _do_init(thing) \ + GST_DEBUG_CATEGORY_INIT (gst_adapter_debug, "GstAdapter", 0, "object to splice and merge buffers to desired size") +GST_BOILERPLATE_FULL (GstAdapter, gst_adapter, GObject, G_TYPE_OBJECT, _do_init) + + static void gst_adapter_dispose (GObject * object); + static void gst_adapter_finalize (GObject * object); + + static void gst_adapter_base_init (gpointer g_class) +{ +} + +static void +gst_adapter_class_init (GstAdapterClass * klass) +{ + GObjectClass *object = G_OBJECT_CLASS (klass); + + object->dispose = gst_adapter_dispose; + object->finalize = gst_adapter_finalize; +} + +static void +gst_adapter_init (GstAdapter * adapter) +{ + adapter->assembled_data = g_malloc (DEFAULT_SIZE); + adapter->assembled_size = DEFAULT_SIZE; +} + +static void +gst_adapter_dispose (GObject * object) +{ + GstAdapter *adapter = GST_ADAPTER (object); + + gst_adapter_clear (adapter); + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_adapter_finalize (GObject * object) +{ + GstAdapter *adapter = GST_ADAPTER (object); + + g_free (adapter->assembled_data); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); +} + +/** + * gst_adapter_new: + * + * Creates a new #GstAdapter. + * + * Returns: a new #GstAdapter + */ +GstAdapter * +gst_adapter_new (void) +{ + return g_object_new (GST_TYPE_ADAPTER, NULL); +} + +/** + * gst_adapter_clear: + * @adapter: the #GstAdapter to clear + * + * Removes all buffers from the @adapter. + */ +void +gst_adapter_clear (GstAdapter * adapter) +{ + g_return_if_fail (GST_IS_ADAPTER (adapter)); + + g_slist_foreach (adapter->buflist, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (adapter->buflist); + adapter->buflist = NULL; + adapter->size = 0; + adapter->skip = 0; + adapter->assembled_len = 0; +} + +/** + * gst_adapter_push: + * @adapter: a #GstAdapter + * @buf: the #GstBuffer to queue into the adapter + * + * Adds the data from @buf to the data stored inside @adapter and takes + * ownership of the buffer. + */ +void +gst_adapter_push (GstAdapter * adapter, GstBuffer * buf) +{ + g_return_if_fail (GST_IS_ADAPTER (adapter)); + g_return_if_fail (GST_IS_BUFFER (buf)); + + adapter->size += GST_BUFFER_SIZE (buf); + adapter->buflist = g_slist_append (adapter->buflist, buf); +} + +/** + * gst_adapter_peek: + * @adapter: a #GstAdapter + * @size: number of bytes to peek + * + * Gets the first @size bytes stored in the @adapter. If this many bytes are + * not available, it returns NULL. The returned pointer is valid until the next + * function is called on the adapter. + * + * Returns: a pointer to the first @size bytes of data or NULL + */ +const guint8 * +gst_adapter_peek (GstAdapter * adapter, guint size) +{ + GstBuffer *cur; + GSList *cur_list; + guint copied; + + g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL); + g_return_val_if_fail (size > 0, NULL); + + /* we don't have enough data, return NULL */ + if (size > adapter->size) + return NULL; + + /* we have enough assembled data, return it */ + if (adapter->assembled_len >= size) + return adapter->assembled_data; + + /* our head buffer has enough data left, return it */ + cur = adapter->buflist->data; + if (GST_BUFFER_SIZE (cur) >= size + adapter->skip) + return GST_BUFFER_DATA (cur) + adapter->skip; + + if (adapter->assembled_size < size) { + adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE; + GST_DEBUG_OBJECT (adapter, "setting size of internal buffer to %u\n", + adapter->assembled_size); + adapter->assembled_data = + g_realloc (adapter->assembled_data, adapter->assembled_size); + } + adapter->assembled_len = size; + copied = GST_BUFFER_SIZE (cur) - adapter->skip; + memcpy (adapter->assembled_data, GST_BUFFER_DATA (cur) + adapter->skip, + copied); + cur_list = g_slist_next (adapter->buflist); + while (copied < size) { + g_assert (cur_list); + cur = cur_list->data; + cur_list = g_slist_next (cur_list); + memcpy (adapter->assembled_data + copied, GST_BUFFER_DATA (cur), + MIN (GST_BUFFER_SIZE (cur), size - copied)); + copied = MIN (size, copied + GST_BUFFER_SIZE (cur)); + } + + return adapter->assembled_data; +} + +/** + * gst_adapter_flush: + * @adapter: a #GstAdapter + * @flush: number of bytes to flush + * + * Flushes the first @flush bytes of the @adapter. + */ +void +gst_adapter_flush (GstAdapter * adapter, guint flush) +{ + GstBuffer *cur; + + g_return_if_fail (GST_IS_ADAPTER (adapter)); + g_return_if_fail (flush > 0); + g_return_if_fail (flush <= adapter->size); + + GST_LOG_OBJECT (adapter, "flushing %u bytes\n", flush); + adapter->size -= flush; + adapter->assembled_len = 0; + while (flush > 0) { + cur = adapter->buflist->data; + if (GST_BUFFER_SIZE (cur) <= flush + adapter->skip) { + /* can skip whole buffer */ + flush -= GST_BUFFER_SIZE (cur) - adapter->skip; + adapter->skip = 0; + adapter->buflist = g_slist_remove (adapter->buflist, cur); + gst_buffer_unref (cur); + } else { + adapter->skip += flush; + break; + } + } +} + +/** + * gst_adapter_available: + * @adapter: a #GstAdapter + * + * Gets the maximum amount of bytes available, that is it returns the maximum + * value that can be supplied to gst_adapter_peek() without that function + * returning NULL. + * + * Returns: amount of bytes available in @adapter + */ +guint +gst_adapter_available (GstAdapter * adapter) +{ + g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0); + + return adapter->size; +} + +/** + * gst_adapter_available_fast: + * @adapter: a #GstAdapter + * + * Gets the maximum amount of bytes available without the need to do expensive + * operations (like copying the data into a temporary buffer). + * + * Returns: amount of bytes available in @adapter without expensive operations + */ +guint +gst_adapter_available_fast (GstAdapter * adapter) +{ + g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0); + + if (!adapter->buflist) + return 0; + if (adapter->assembled_len) + return adapter->assembled_len; + g_assert (GST_BUFFER_SIZE (adapter->buflist->data) > adapter->skip); + return GST_BUFFER_SIZE (adapter->buflist->data) - adapter->skip; +} diff --git a/gst/base/gstadapter.h b/gst/base/gstadapter.h new file mode 100644 index 0000000..4257cf5 --- /dev/null +++ b/gst/base/gstadapter.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#ifndef __GST_ADAPTER_H__ +#define __GST_ADAPTER_H__ + +G_BEGIN_DECLS + + +#define GST_TYPE_ADAPTER \ + (gst_adapter_get_type()) +#define GST_ADAPTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ADAPTER,GstAdapter)) +#define GST_ADAPTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ADAPTER,GstAdapterClass)) +#define GST_IS_ADAPTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ADAPTER)) +#define GST_IS_ADAPTER_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ADAPTER)) + +typedef struct _GstAdapter GstAdapter; +typedef struct _GstAdapterClass GstAdapterClass; + +struct _GstAdapter { + GObject object; + + GSList * buflist; + guint size; + guint skip; + + /* we keep state of assembled pieces */ + guint8 * assembled_data; + guint assembled_size; + guint assembled_len; + + gpointer _gst_reserved[GST_PADDING]; +}; + +struct _GstAdapterClass { + GObjectClass parent_class; + + gpointer _gst_reserved[GST_PADDING]; +}; + +GstAdapter * gst_adapter_new (void); + +void gst_adapter_clear (GstAdapter *adapter); +void gst_adapter_push (GstAdapter *adapter, GstBuffer* buf); +const guint8 * gst_adapter_peek (GstAdapter *adapter, guint size); +void gst_adapter_flush (GstAdapter *adapter, guint flush); +guint gst_adapter_available (GstAdapter *adapter); +guint gst_adapter_available_fast (GstAdapter *adapter); + + +G_END_DECLS + +#endif /* __GST_ADAPTER_H__ */ diff --git a/libs/gst/base/Makefile.am b/libs/gst/base/Makefile.am index 9037e1b..a921189 100644 --- a/libs/gst/base/Makefile.am +++ b/libs/gst/base/Makefile.am @@ -3,6 +3,7 @@ lib_LTLIBRARIES = libgstbase-@GST_MAJORMINOR@.la libgstbase_@GST_MAJORMINOR@_la_DEPENDENCIES = \ ../libgstreamer-@GST_MAJORMINOR@.la libgstbase_@GST_MAJORMINOR@_la_SOURCES = \ + gstadapter.c \ gstbasesink.c \ gstbasesrc.c \ gstbasetransform.c \ @@ -19,6 +20,7 @@ libgstbase_@GST_MAJORMINOR@includedir = \ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/base libgstbase_@GST_MAJORMINOR@include_HEADERS = \ + gstadapter.h \ gstbasesink.h \ gstbasesrc.h \ gstbasetransform.h \ diff --git a/libs/gst/base/gstadapter.c b/libs/gst/base/gstadapter.c new file mode 100644 index 0000000..993c78c --- /dev/null +++ b/libs/gst/base/gstadapter.c @@ -0,0 +1,257 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include "gstadapter.h" + +/* default size for the assembled data buffer */ +#define DEFAULT_SIZE 16 + +GST_DEBUG_CATEGORY_STATIC (gst_adapter_debug); +#define GST_CAT_DEFAULT gst_adapter_debug + +#define _do_init(thing) \ + GST_DEBUG_CATEGORY_INIT (gst_adapter_debug, "GstAdapter", 0, "object to splice and merge buffers to desired size") +GST_BOILERPLATE_FULL (GstAdapter, gst_adapter, GObject, G_TYPE_OBJECT, _do_init) + + static void gst_adapter_dispose (GObject * object); + static void gst_adapter_finalize (GObject * object); + + static void gst_adapter_base_init (gpointer g_class) +{ +} + +static void +gst_adapter_class_init (GstAdapterClass * klass) +{ + GObjectClass *object = G_OBJECT_CLASS (klass); + + object->dispose = gst_adapter_dispose; + object->finalize = gst_adapter_finalize; +} + +static void +gst_adapter_init (GstAdapter * adapter) +{ + adapter->assembled_data = g_malloc (DEFAULT_SIZE); + adapter->assembled_size = DEFAULT_SIZE; +} + +static void +gst_adapter_dispose (GObject * object) +{ + GstAdapter *adapter = GST_ADAPTER (object); + + gst_adapter_clear (adapter); + + GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); +} + +static void +gst_adapter_finalize (GObject * object) +{ + GstAdapter *adapter = GST_ADAPTER (object); + + g_free (adapter->assembled_data); + + GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); +} + +/** + * gst_adapter_new: + * + * Creates a new #GstAdapter. + * + * Returns: a new #GstAdapter + */ +GstAdapter * +gst_adapter_new (void) +{ + return g_object_new (GST_TYPE_ADAPTER, NULL); +} + +/** + * gst_adapter_clear: + * @adapter: the #GstAdapter to clear + * + * Removes all buffers from the @adapter. + */ +void +gst_adapter_clear (GstAdapter * adapter) +{ + g_return_if_fail (GST_IS_ADAPTER (adapter)); + + g_slist_foreach (adapter->buflist, (GFunc) gst_mini_object_unref, NULL); + g_slist_free (adapter->buflist); + adapter->buflist = NULL; + adapter->size = 0; + adapter->skip = 0; + adapter->assembled_len = 0; +} + +/** + * gst_adapter_push: + * @adapter: a #GstAdapter + * @buf: the #GstBuffer to queue into the adapter + * + * Adds the data from @buf to the data stored inside @adapter and takes + * ownership of the buffer. + */ +void +gst_adapter_push (GstAdapter * adapter, GstBuffer * buf) +{ + g_return_if_fail (GST_IS_ADAPTER (adapter)); + g_return_if_fail (GST_IS_BUFFER (buf)); + + adapter->size += GST_BUFFER_SIZE (buf); + adapter->buflist = g_slist_append (adapter->buflist, buf); +} + +/** + * gst_adapter_peek: + * @adapter: a #GstAdapter + * @size: number of bytes to peek + * + * Gets the first @size bytes stored in the @adapter. If this many bytes are + * not available, it returns NULL. The returned pointer is valid until the next + * function is called on the adapter. + * + * Returns: a pointer to the first @size bytes of data or NULL + */ +const guint8 * +gst_adapter_peek (GstAdapter * adapter, guint size) +{ + GstBuffer *cur; + GSList *cur_list; + guint copied; + + g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL); + g_return_val_if_fail (size > 0, NULL); + + /* we don't have enough data, return NULL */ + if (size > adapter->size) + return NULL; + + /* we have enough assembled data, return it */ + if (adapter->assembled_len >= size) + return adapter->assembled_data; + + /* our head buffer has enough data left, return it */ + cur = adapter->buflist->data; + if (GST_BUFFER_SIZE (cur) >= size + adapter->skip) + return GST_BUFFER_DATA (cur) + adapter->skip; + + if (adapter->assembled_size < size) { + adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE; + GST_DEBUG_OBJECT (adapter, "setting size of internal buffer to %u\n", + adapter->assembled_size); + adapter->assembled_data = + g_realloc (adapter->assembled_data, adapter->assembled_size); + } + adapter->assembled_len = size; + copied = GST_BUFFER_SIZE (cur) - adapter->skip; + memcpy (adapter->assembled_data, GST_BUFFER_DATA (cur) + adapter->skip, + copied); + cur_list = g_slist_next (adapter->buflist); + while (copied < size) { + g_assert (cur_list); + cur = cur_list->data; + cur_list = g_slist_next (cur_list); + memcpy (adapter->assembled_data + copied, GST_BUFFER_DATA (cur), + MIN (GST_BUFFER_SIZE (cur), size - copied)); + copied = MIN (size, copied + GST_BUFFER_SIZE (cur)); + } + + return adapter->assembled_data; +} + +/** + * gst_adapter_flush: + * @adapter: a #GstAdapter + * @flush: number of bytes to flush + * + * Flushes the first @flush bytes of the @adapter. + */ +void +gst_adapter_flush (GstAdapter * adapter, guint flush) +{ + GstBuffer *cur; + + g_return_if_fail (GST_IS_ADAPTER (adapter)); + g_return_if_fail (flush > 0); + g_return_if_fail (flush <= adapter->size); + + GST_LOG_OBJECT (adapter, "flushing %u bytes\n", flush); + adapter->size -= flush; + adapter->assembled_len = 0; + while (flush > 0) { + cur = adapter->buflist->data; + if (GST_BUFFER_SIZE (cur) <= flush + adapter->skip) { + /* can skip whole buffer */ + flush -= GST_BUFFER_SIZE (cur) - adapter->skip; + adapter->skip = 0; + adapter->buflist = g_slist_remove (adapter->buflist, cur); + gst_buffer_unref (cur); + } else { + adapter->skip += flush; + break; + } + } +} + +/** + * gst_adapter_available: + * @adapter: a #GstAdapter + * + * Gets the maximum amount of bytes available, that is it returns the maximum + * value that can be supplied to gst_adapter_peek() without that function + * returning NULL. + * + * Returns: amount of bytes available in @adapter + */ +guint +gst_adapter_available (GstAdapter * adapter) +{ + g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0); + + return adapter->size; +} + +/** + * gst_adapter_available_fast: + * @adapter: a #GstAdapter + * + * Gets the maximum amount of bytes available without the need to do expensive + * operations (like copying the data into a temporary buffer). + * + * Returns: amount of bytes available in @adapter without expensive operations + */ +guint +gst_adapter_available_fast (GstAdapter * adapter) +{ + g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0); + + if (!adapter->buflist) + return 0; + if (adapter->assembled_len) + return adapter->assembled_len; + g_assert (GST_BUFFER_SIZE (adapter->buflist->data) > adapter->skip); + return GST_BUFFER_SIZE (adapter->buflist->data) - adapter->skip; +} diff --git a/libs/gst/base/gstadapter.h b/libs/gst/base/gstadapter.h new file mode 100644 index 0000000..4257cf5 --- /dev/null +++ b/libs/gst/base/gstadapter.h @@ -0,0 +1,75 @@ +/* GStreamer + * Copyright (C) 2004 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#ifndef __GST_ADAPTER_H__ +#define __GST_ADAPTER_H__ + +G_BEGIN_DECLS + + +#define GST_TYPE_ADAPTER \ + (gst_adapter_get_type()) +#define GST_ADAPTER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ADAPTER,GstAdapter)) +#define GST_ADAPTER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ADAPTER,GstAdapterClass)) +#define GST_IS_ADAPTER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ADAPTER)) +#define GST_IS_ADAPTER_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ADAPTER)) + +typedef struct _GstAdapter GstAdapter; +typedef struct _GstAdapterClass GstAdapterClass; + +struct _GstAdapter { + GObject object; + + GSList * buflist; + guint size; + guint skip; + + /* we keep state of assembled pieces */ + guint8 * assembled_data; + guint assembled_size; + guint assembled_len; + + gpointer _gst_reserved[GST_PADDING]; +}; + +struct _GstAdapterClass { + GObjectClass parent_class; + + gpointer _gst_reserved[GST_PADDING]; +}; + +GstAdapter * gst_adapter_new (void); + +void gst_adapter_clear (GstAdapter *adapter); +void gst_adapter_push (GstAdapter *adapter, GstBuffer* buf); +const guint8 * gst_adapter_peek (GstAdapter *adapter, guint size); +void gst_adapter_flush (GstAdapter *adapter, guint flush); +guint gst_adapter_available (GstAdapter *adapter); +guint gst_adapter_available_fast (GstAdapter *adapter); + + +G_END_DECLS + +#endif /* __GST_ADAPTER_H__ */ -- 2.7.4