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 4f5da70..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,21 +51,40 @@ typedef struct {
   gpointer _gst_reserved[GST_PADDING];
 } GstByteWriter;
 
+GST_BASE_API
 GstByteWriter * gst_byte_writer_new             (void) G_GNUC_MALLOC;
+
+GST_BASE_API
 GstByteWriter * gst_byte_writer_new_with_size   (guint size, gboolean fixed) G_GNUC_MALLOC;
+
+GST_BASE_API
 GstByteWriter * gst_byte_writer_new_with_data   (guint8 *data, guint size, gboolean initialized) G_GNUC_MALLOC;
 
+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;
 
 /**
@@ -73,8 +92,6 @@ GstBuffer *     gst_byte_writer_reset_and_get_buffer    (GstByteWriter *writer)
  * @writer: #GstByteWriter instance
  *
  * Returns: The current position of the read/write cursor
- *
- * Since: 0.10.26
  */
 /**
  * gst_byte_writer_set_pos:
@@ -85,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)
 {
@@ -118,39 +126,92 @@ gst_byte_writer_get_size (const GstByteWriter *writer)
 {
   return gst_byte_reader_get_size ((const GstByteReader *) writer);
 }
-#endif
 
+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);
 
@@ -164,8 +225,6 @@ gboolean        gst_byte_writer_put_buffer        (GstByteWriter *writer, GstBuf
  * 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)
@@ -300,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() */
@@ -356,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