aggregator: Assert if the sink/src pad type that is to be used is not a GstAggregator...
[platform/upstream/gstreamer.git] / libs / gst / base / gstbytewriter.h
index 37c73b1..365c774 100644 (file)
@@ -14,8 +14,8 @@
  *
  * 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #ifndef __GST_BYTE_WRITER_H__
@@ -51,29 +51,47 @@ typedef struct {
   gpointer _gst_reserved[GST_PADDING];
 } GstByteWriter;
 
-GstByteWriter * gst_byte_writer_new (void);
-GstByteWriter * gst_byte_writer_new_with_size (guint size, gboolean fixed);
-GstByteWriter * gst_byte_writer_new_with_data (guint8 *data, guint size, gboolean initialized);
+GST_BASE_API
+GstByteWriter * gst_byte_writer_new             (void) G_GNUC_MALLOC;
 
-void gst_byte_writer_init (GstByteWriter *writer);
-void gst_byte_writer_init_with_size (GstByteWriter *writer, guint size, gboolean fixed);
-void gst_byte_writer_init_with_data (GstByteWriter *writer, guint8 *data, guint size, gboolean initialized);
+GST_BASE_API
+GstByteWriter * gst_byte_writer_new_with_size   (guint size, gboolean fixed) G_GNUC_MALLOC;
 
-void gst_byte_writer_free (GstByteWriter *writer);
-guint8 * gst_byte_writer_free_and_get_data (GstByteWriter *writer);
-GstBuffer *gst_byte_writer_free_and_get_buffer (GstByteWriter *writer);
+GST_BASE_API
+GstByteWriter * gst_byte_writer_new_with_data   (guint8 *data, guint size, gboolean initialized) G_GNUC_MALLOC;
 
-void gst_byte_writer_reset (GstByteWriter *writer);
-guint8 * gst_byte_writer_reset_and_get_data (GstByteWriter *writer);
-GstBuffer *gst_byte_writer_reset_and_get_buffer (GstByteWriter *writer);
+GST_BASE_API
+void            gst_byte_writer_init            (GstByteWriter *writer);
+
+GST_BASE_API
+void            gst_byte_writer_init_with_size  (GstByteWriter *writer, guint size, gboolean fixed);
+
+GST_BASE_API
+void            gst_byte_writer_init_with_data  (GstByteWriter *writer, guint8 *data,
+                                                 guint size, gboolean initialized);
+GST_BASE_API
+void            gst_byte_writer_free                    (GstByteWriter *writer);
+
+GST_BASE_API
+guint8 *        gst_byte_writer_free_and_get_data       (GstByteWriter *writer);
+
+GST_BASE_API
+GstBuffer *     gst_byte_writer_free_and_get_buffer     (GstByteWriter *writer) G_GNUC_MALLOC;
+
+GST_BASE_API
+void            gst_byte_writer_reset                   (GstByteWriter *writer);
+
+GST_BASE_API
+guint8 *        gst_byte_writer_reset_and_get_data      (GstByteWriter *writer);
+
+GST_BASE_API
+GstBuffer *     gst_byte_writer_reset_and_get_buffer    (GstByteWriter *writer) G_GNUC_MALLOC;
 
 /**
  * gst_byte_writer_get_pos:
  * @writer: #GstByteWriter instance
  *
  * Returns: The current position of the read/write cursor
- *
- * Since: 0.10.26
  */
 /**
  * gst_byte_writer_set_pos:
@@ -84,22 +102,13 @@ GstBuffer *gst_byte_writer_reset_and_get_buffer (GstByteWriter *writer);
  * can only be between 0 and the current size.
  *
  * Returns: %TRUE if the new position could be set
- *
- * Since: 0.10.26
  */
 /**
  * gst_byte_writer_get_size:
  * @writer: #GstByteWriter instance
  *
  * Returns: The current, initialized size of the data
- *
- * Since: 0.10.26
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC guint gst_byte_writer_get_pos (const GstByteWriter *writer);
-G_INLINE_FUNC gboolean gst_byte_writer_set_pos (GstByteWriter *writer, guint pos);
-G_INLINE_FUNC guint gst_byte_writer_get_size (const GstByteWriter *writer);
-#else
 static inline guint
 gst_byte_writer_get_pos (const GstByteWriter *writer)
 {
@@ -117,40 +126,94 @@ gst_byte_writer_get_size (const GstByteWriter *writer)
 {
   return gst_byte_reader_get_size ((const GstByteReader *) writer);
 }
-#endif
 
-guint gst_byte_writer_get_remaining (const GstByteWriter *writer);
-gboolean gst_byte_writer_ensure_free_space (GstByteWriter *writer, guint size);
-
-gboolean gst_byte_writer_put_uint8 (GstByteWriter *writer, guint8 val);
-gboolean gst_byte_writer_put_int8 (GstByteWriter *writer, gint8 val);
-gboolean gst_byte_writer_put_uint16_be (GstByteWriter *writer, guint16 val);
-gboolean gst_byte_writer_put_uint16_le (GstByteWriter *writer, guint16 val);
-gboolean gst_byte_writer_put_int16_be (GstByteWriter *writer, gint16 val);
-gboolean gst_byte_writer_put_int16_le (GstByteWriter *writer, gint16 val);
-gboolean gst_byte_writer_put_uint24_be (GstByteWriter *writer, guint32 val);
-gboolean gst_byte_writer_put_uint24_le (GstByteWriter *writer, guint32 val);
-gboolean gst_byte_writer_put_int24_be (GstByteWriter *writer, gint32 val);
-gboolean gst_byte_writer_put_int24_le (GstByteWriter *writer, gint32 val);
-gboolean gst_byte_writer_put_uint32_be (GstByteWriter *writer, guint32 val);
-gboolean gst_byte_writer_put_uint32_le (GstByteWriter *writer, guint32 val);
-gboolean gst_byte_writer_put_int32_be (GstByteWriter *writer, gint32 val);
-gboolean gst_byte_writer_put_int32_le (GstByteWriter *writer, gint32 val);
-gboolean gst_byte_writer_put_uint64_be (GstByteWriter *writer, guint64 val);
-gboolean gst_byte_writer_put_uint64_le (GstByteWriter *writer, guint64 val);
-gboolean gst_byte_writer_put_int64_be (GstByteWriter *writer, gint64 val);
-gboolean gst_byte_writer_put_int64_le (GstByteWriter *writer, gint64 val);
-
-gboolean gst_byte_writer_put_float32_be (GstByteWriter *writer, gfloat val);
-gboolean gst_byte_writer_put_float32_le (GstByteWriter *writer, gfloat val);
-gboolean gst_byte_writer_put_float64_be (GstByteWriter *writer, gdouble val);
-gboolean gst_byte_writer_put_float64_le (GstByteWriter *writer, gdouble val);
-
-gboolean gst_byte_writer_put_data (GstByteWriter *writer, const guint8 *data, guint size);
-gboolean gst_byte_writer_fill (GstByteWriter *writer, guint8 value, guint size);
-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);
+GST_BASE_API
+guint           gst_byte_writer_get_remaining     (const GstByteWriter *writer);
+
+GST_BASE_API
+gboolean        gst_byte_writer_ensure_free_space (GstByteWriter *writer, guint size);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint8         (GstByteWriter *writer, guint8 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int8          (GstByteWriter *writer, gint8 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint16_be     (GstByteWriter *writer, guint16 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint16_le     (GstByteWriter *writer, guint16 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int16_be      (GstByteWriter *writer, gint16 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int16_le      (GstByteWriter *writer, gint16 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint24_be     (GstByteWriter *writer, guint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint24_le     (GstByteWriter *writer, guint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int24_be      (GstByteWriter *writer, gint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int24_le      (GstByteWriter *writer, gint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint32_be     (GstByteWriter *writer, guint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint32_le     (GstByteWriter *writer, guint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int32_be      (GstByteWriter *writer, gint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int32_le      (GstByteWriter *writer, gint32 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint64_be     (GstByteWriter *writer, guint64 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_uint64_le     (GstByteWriter *writer, guint64 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int64_be      (GstByteWriter *writer, gint64 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_int64_le      (GstByteWriter *writer, gint64 val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_float32_be    (GstByteWriter *writer, gfloat val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_float32_le    (GstByteWriter *writer, gfloat val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_float64_be    (GstByteWriter *writer, gdouble val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_float64_le    (GstByteWriter *writer, gdouble val);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_data          (GstByteWriter *writer, const guint8 *data, guint size);
+
+GST_BASE_API
+gboolean        gst_byte_writer_fill              (GstByteWriter *writer, guint8 value, guint size);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_string_utf8   (GstByteWriter *writer, const gchar *data);
+
+GST_BASE_API
+gboolean        gst_byte_writer_put_string_utf16  (GstByteWriter *writer, const guint16 *data);
+
+GST_BASE_API
+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:
@@ -162,8 +225,6 @@ gboolean gst_byte_writer_put_string_utf32 (GstByteWriter *writer, const guint32
  * ISO-8859-1).
  *
  * Returns: %TRUE if the string could be written
- *
- * Since: 0.10.26
  */
 #define gst_byte_writer_put_string(writer, data) \
   gst_byte_writer_put_string_utf8(writer, data)
@@ -298,6 +359,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() */
@@ -354,6 +458,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