bytereader: add inlined _unchecked() variants for some functions
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 2 Sep 2009 10:20:04 +0000 (11:20 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 6 Sep 2009 17:51:13 +0000 (18:51 +0100)
API: gst_byte_reader_skip_unchecked()
API: gst_byte_reader_peek_*_unchecked()
API: gst_byte_reader_get_*_unchecked()
API: gst_byte_reader_{peek,get,dup}_data_unchecked()

docs/libs/gstreamer-libs-sections.txt
libs/gst/base/Makefile.am
libs/gst/base/gstbytereader-docs.h [new file with mode: 0644]
libs/gst/base/gstbytereader.c
libs/gst/base/gstbytereader.h
tests/check/libs/bytereader.c

index bf03050..bc2e140 100644 (file)
@@ -465,6 +465,56 @@ gst_byte_reader_skip_string
 gst_byte_reader_skip_string_utf8
 gst_byte_reader_skip_string_utf16
 gst_byte_reader_skip_string_utf32
+
+gst_byte_reader_skip_unchecked
+
+gst_byte_reader_get_int8_unchecked
+gst_byte_reader_get_int16_be_unchecked
+gst_byte_reader_get_int16_le_unchecked
+gst_byte_reader_get_int24_be_unchecked
+gst_byte_reader_get_int24_le_unchecked
+gst_byte_reader_get_int32_be_unchecked
+gst_byte_reader_get_int32_le_unchecked
+gst_byte_reader_get_int64_be_unchecked
+gst_byte_reader_get_int64_le_unchecked
+
+gst_byte_reader_get_uint8_unchecked
+gst_byte_reader_get_uint16_be_unchecked
+gst_byte_reader_get_uint16_le_unchecked
+gst_byte_reader_get_uint24_be_unchecked
+gst_byte_reader_get_uint24_le_unchecked
+gst_byte_reader_get_uint32_be_unchecked
+gst_byte_reader_get_uint32_le_unchecked
+gst_byte_reader_get_uint64_be_unchecked
+gst_byte_reader_get_uint64_le_unchecked
+
+gst_byte_reader_peek_int8_unchecked
+gst_byte_reader_peek_int16_be_unchecked
+gst_byte_reader_peek_int16_le_unchecked
+gst_byte_reader_peek_int24_be_unchecked
+gst_byte_reader_peek_int24_le_unchecked
+gst_byte_reader_peek_int32_be_unchecked
+gst_byte_reader_peek_int32_le_unchecked
+gst_byte_reader_peek_int64_be_unchecked
+gst_byte_reader_peek_int64_le_unchecked
+
+gst_byte_reader_peek_uint8_unchecked
+gst_byte_reader_peek_uint16_be_unchecked
+gst_byte_reader_peek_uint16_le_unchecked
+gst_byte_reader_peek_uint24_be_unchecked
+gst_byte_reader_peek_uint24_le_unchecked
+gst_byte_reader_peek_uint32_be_unchecked
+gst_byte_reader_peek_uint32_le_unchecked
+gst_byte_reader_peek_uint64_be_unchecked
+gst_byte_reader_peek_uint64_le_unchecked
+
+gst_byte_reader_dup_data_unchecked
+gst_byte_reader_get_data_unchecked
+gst_byte_reader_peek_data_unchecked
+
+<SUBSECTION Private>
+# seems to be a header parsing bug
+g_memdup
 </SECTION>
 
 <SECTION>
index aff0d5c..d29a134 100644 (file)
@@ -33,6 +33,9 @@ libgstbase_@GST_MAJORMINOR@include_HEADERS =  \
        gsttypefindhelper.h     \
        gstdataqueue.h
 
+noinst_HEADERS = \
+       gstbytereader-docs.h
+
 CLEANFILES = *.gcno *.gcda *.gcov
 
 %.c.gcov: .libs/libgstbase_@GST_MAJORMINOR@_la-%.gcda %.c
diff --git a/libs/gst/base/gstbytereader-docs.h b/libs/gst/base/gstbytereader-docs.h
new file mode 100644 (file)
index 0000000..bbc1cd3
--- /dev/null
@@ -0,0 +1,547 @@
+/* GStreamer byte reader dummy header for gtk-doc
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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.
+ */
+
+/* This header is not installed, it just contains stuff for gtk-doc to parse,
+ * in particular docs and some dummy function declarations for the static
+ * inline functions we generate via macros in gstbytereader.h.
+ */
+
+#error "This header should never be included in code, it is only for gtk-doc"
+
+/**
+ * gst_byte_reader_skip_unchecked:
+ * @reader: a #GstByteReader instance
+ * @nbytes: the number of bytes to skip
+ *
+ * Skips @nbytes bytes of the #GstByteReader instance without checking if
+ * there are enough bytes available in the byte reader.
+ *
+ * Since: 0.10.25
+ */
+void gst_byte_reader_skip_unchecked (GstByteReader * reader, guint nbytes);
+
+/**
+ * gst_byte_reader_get_uint8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 8 bit integer without checking if there are enough bytes
+ * available in the byte reader and update the current position.
+ *
+ * Returns: unsigned 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 8 bit integer without checking if there are enough bytes
+ * available in the byte reader, but do not advance the current read position.
+ *
+ * Returns: unsigned 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an signed 8 bit integer without checking if there are enough bytes
+ * available in the byte reader and update the current position.
+ *
+ * Returns: signed 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an signed 8 bit integer without checking if there are enough bytes
+ * available in the byte reader, but do not advance the current read position.
+ *
+ * Returns: signed 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint8 gst_byte_reader_get_uint8_unchecked (GstByteReader * reader);
+guint8 gst_byte_reader_peek_uint8_unchecked (GstByteReader * reader);
+gint8 gst_byte_reader_get_int8_unchecked (GstByteReader * reader);
+gint8 gst_byte_reader_peek_int8_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint16 gst_byte_reader_get_uint16_le_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_get_uint16_be_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_peek_uint16_le_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_peek_uint16_be_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_get_int16_le_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_get_int16_be_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_peek_int16_le_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_peek_int16_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+guint32 gst_byte_reader_get_uint24_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_get_uint24_be_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint24_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint24_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int24_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int24_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int24_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int24_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint32 gst_byte_reader_get_uint32_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_get_uint32_be_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint32_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint32_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int32_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int32_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int32_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int32_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint64 gst_byte_reader_get_uint64_le_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_get_uint64_be_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_peek_uint64_le_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_peek_uint64_be_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_get_int64_le_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_get_int64_be_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_peek_int64_le_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_peek_int64_be_unchecked (GstByteReader * reader);
+
+
+/**
+ * gst_byte_reader_peek_data_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Returns: a constant pointer to the current data position
+ *
+ * Since: 0.10.25
+ */
+const guint8 * gst_byte_reader_peek_data_unchecked (GstByteReader * reader);
+/**
+ * gst_byte_reader_get_data_unchecked:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ *
+ * Returns a constant pointer to the current data position without checking
+ * if at least @size bytes are left. Advances the current read position by
+ * @size bytes.
+ *
+ * Returns: a constant pointer to the current data position.
+ *
+ * Since: 0.10.25
+ */
+const guint8 * gst_byte_reader_get_data_unchecked (GstByteReader * reader, guint size);
+/**
+ * gst_byte_reader_dup_data:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ *
+ * Returns a newly-allocated copy of the data at the current data position
+ * without checking if at least @size bytes are left. Advances the current read
+ * position by @size bytes.
+ *
+ * Returns: a newly-allocated copy of the data @size bytes in size. Free with
+ *     g_free() when no longer needed.
+ *
+ * Since: 0.10.25
+ */
+guint8 * gst_byte_reader_dup_data_unchecked (GstByteReader * reader, guint size);
+
index 76fccf6..bad186e 100644 (file)
@@ -1,6 +1,7 @@
-/* GStreamer
+/* GStreamer byte reader
  *
  * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -689,9 +690,9 @@ gst_byte_reader_skip (GstByteReader * reader, guint nbytes)
  * Since: 0.10.22
  */
 
-#define GST_BYTE_READER_READ_INTS(bits) \
+#define GST_BYTE_READER_PEEK_GET_INTS(bits,type,name) \
 gboolean \
-gst_byte_reader_get_uint##bits##_le (GstByteReader *reader, guint##bits *val) \
+gst_byte_reader_get_##name (GstByteReader * reader, type * val) \
 { \
   g_return_val_if_fail (reader != NULL, FALSE); \
   g_return_val_if_fail (val != NULL, FALSE); \
@@ -699,41 +700,12 @@ gst_byte_reader_get_uint##bits##_le (GstByteReader *reader, guint##bits *val) \
   if (gst_byte_reader_get_remaining (reader) < bits / 8) \
     return FALSE; \
   \
-  *val = GST_READ_UINT##bits##_LE (&reader->data[reader->byte]); \
-  reader->byte += bits / 8; \
-  return TRUE; \
-} \
-\
-gboolean \
-gst_byte_reader_get_uint##bits##_be (GstByteReader *reader, guint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_BE (&reader->data[reader->byte]); \
-  reader->byte += bits / 8; \
-  return TRUE; \
-} \
-\
-gboolean \
-gst_byte_reader_get_int##bits##_le (GstByteReader *reader, gint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_LE (&reader->data[reader->byte]); \
-  reader->byte += bits / 8; \
+  *val = gst_byte_reader_get_##name##_unchecked (reader); \
   return TRUE; \
 } \
 \
 gboolean \
-gst_byte_reader_get_int##bits##_be (GstByteReader *reader, gint##bits *val) \
+gst_byte_reader_peek_##name (GstByteReader * reader, type * val) \
 { \
   g_return_val_if_fail (reader != NULL, FALSE); \
   g_return_val_if_fail (val != NULL, FALSE); \
@@ -741,254 +713,32 @@ gst_byte_reader_get_int##bits##_be (GstByteReader *reader, gint##bits *val) \
   if (gst_byte_reader_get_remaining (reader) < bits / 8) \
     return FALSE; \
   \
-  *val = GST_READ_UINT##bits##_BE (&reader->data[reader->byte]); \
-  reader->byte += bits / 8; \
-  return TRUE; \
-} \
-gboolean \
-gst_byte_reader_peek_uint##bits##_le (GstByteReader *reader, guint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_LE (&reader->data[reader->byte]); \
-  return TRUE; \
-} \
-\
-gboolean \
-gst_byte_reader_peek_uint##bits##_be (GstByteReader *reader, guint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_BE (&reader->data[reader->byte]); \
-  return TRUE; \
-} \
-\
-gboolean \
-gst_byte_reader_peek_int##bits##_le (GstByteReader *reader, gint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_LE (&reader->data[reader->byte]); \
-  return TRUE; \
-} \
-\
-gboolean \
-gst_byte_reader_peek_int##bits##_be (GstByteReader *reader, gint##bits *val) \
-{ \
-  g_return_val_if_fail (reader != NULL, FALSE); \
-  g_return_val_if_fail (val != NULL, FALSE); \
-  \
-  if (gst_byte_reader_get_remaining (reader) < bits / 8) \
-    return FALSE; \
-  \
-  *val = GST_READ_UINT##bits##_BE (&reader->data[reader->byte]); \
+  *val = gst_byte_reader_peek_##name##_unchecked (reader); \
   return TRUE; \
 }
 
+GST_BYTE_READER_PEEK_GET_INTS(8,guint8,uint8)
+GST_BYTE_READER_PEEK_GET_INTS(8,gint8,int8)
 
-GST_BYTE_READER_READ_INTS (16);
-GST_BYTE_READER_READ_INTS (32);
-GST_BYTE_READER_READ_INTS (64);
+GST_BYTE_READER_PEEK_GET_INTS(16,guint16,uint16_le)
+GST_BYTE_READER_PEEK_GET_INTS(16,guint16,uint16_be)
+GST_BYTE_READER_PEEK_GET_INTS(16,gint16,int16_le)
+GST_BYTE_READER_PEEK_GET_INTS(16,gint16,int16_be)
 
-gboolean
-gst_byte_reader_get_uint8 (GstByteReader * reader, guint8 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
+GST_BYTE_READER_PEEK_GET_INTS(24,guint32,uint24_le)
+GST_BYTE_READER_PEEK_GET_INTS(24,guint32,uint24_be)
+GST_BYTE_READER_PEEK_GET_INTS(24,gint32,int24_le)
+GST_BYTE_READER_PEEK_GET_INTS(24,gint32,int24_be)
 
-  if (reader->byte >= reader->size)
-    return FALSE;
+GST_BYTE_READER_PEEK_GET_INTS(32,guint32,uint32_le)
+GST_BYTE_READER_PEEK_GET_INTS(32,guint32,uint32_be)
+GST_BYTE_READER_PEEK_GET_INTS(32,gint32,int32_le)
+GST_BYTE_READER_PEEK_GET_INTS(32,gint32,int32_be)
 
-  *val = GST_READ_UINT8 (&reader->data[reader->byte]);
-  reader->byte++;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_get_int8 (GstByteReader * reader, gint8 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (reader->byte >= reader->size)
-    return FALSE;
-
-  *val = GST_READ_UINT8 (&reader->data[reader->byte]);
-  reader->byte++;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_uint8 (GstByteReader * reader, guint8 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (reader->byte >= reader->size)
-    return FALSE;
-
-  *val = GST_READ_UINT8 (&reader->data[reader->byte]);
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_int8 (GstByteReader * reader, gint8 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (reader->byte >= reader->size)
-    return FALSE;
-
-  *val = GST_READ_UINT8 (&reader->data[reader->byte]);
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_get_uint24_le (GstByteReader * reader, guint32 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  *val = GST_READ_UINT24_LE (&reader->data[reader->byte]);
-  reader->byte += 3;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_get_uint24_be (GstByteReader * reader, guint32 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  *val = GST_READ_UINT24_BE (&reader->data[reader->byte]);
-  reader->byte += 3;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_get_int24_le (GstByteReader * reader, gint32 * val)
-{
-  guint32 ret;
-
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  ret = GST_READ_UINT24_LE (&reader->data[reader->byte]);
-  if (ret & 0x00800000)
-    ret |= 0xff000000;
-
-  reader->byte += 3;
-
-  *val = ret;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_get_int24_be (GstByteReader * reader, gint32 * val)
-{
-  guint32 ret;
-
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  ret = GST_READ_UINT24_BE (&reader->data[reader->byte]);
-  if (ret & 0x00800000)
-    ret |= 0xff000000;
-
-  reader->byte += 3;
-
-  *val = ret;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_uint24_le (GstByteReader * reader, guint32 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  *val = GST_READ_UINT24_LE (&reader->data[reader->byte]);
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_uint24_be (GstByteReader * reader, guint32 * val)
-{
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  *val = GST_READ_UINT24_BE (&reader->data[reader->byte]);
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_int24_le (GstByteReader * reader, gint32 * val)
-{
-  guint32 ret;
-
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  ret = GST_READ_UINT24_LE (&reader->data[reader->byte]);
-  if (ret & 0x00800000)
-    ret |= 0xff000000;
-
-  *val = ret;
-  return TRUE;
-}
-
-gboolean
-gst_byte_reader_peek_int24_be (GstByteReader * reader, gint32 * val)
-{
-  guint32 ret;
-
-  g_return_val_if_fail (reader != NULL, FALSE);
-  g_return_val_if_fail (val != NULL, FALSE);
-
-  if (gst_byte_reader_get_remaining (reader) < 3)
-    return FALSE;
-
-  ret = GST_READ_UINT24_BE (&reader->data[reader->byte]);
-  if (ret & 0x00800000)
-    ret |= 0xff000000;
-
-  *val = ret;
-  return TRUE;
-}
+GST_BYTE_READER_PEEK_GET_INTS(64,guint64,uint64_le)
+GST_BYTE_READER_PEEK_GET_INTS(64,guint64,uint64_be)
+GST_BYTE_READER_PEEK_GET_INTS(64,gint64,int64_le)
+GST_BYTE_READER_PEEK_GET_INTS(64,gint64,int64_be)
 
 /**
  * gst_byte_reader_get_float32_le:
@@ -1174,8 +924,7 @@ gst_byte_reader_get_data (GstByteReader * reader, guint size,
   if (gst_byte_reader_get_remaining (reader) < size)
     return FALSE;
 
-  *val = reader->data + reader->byte;
-  reader->byte += size;
+  *val = gst_byte_reader_get_data_unchecked (reader, size);
   return TRUE;
 }
 
@@ -1204,7 +953,7 @@ gst_byte_reader_peek_data (GstByteReader * reader, guint size,
   if (gst_byte_reader_get_remaining (reader) < size)
     return FALSE;
 
-  *val = reader->data + reader->byte;
+  *val = gst_byte_reader_peek_data_unchecked (reader);
   return TRUE;
 }
 
index 96c5916..1a65c9a 100644 (file)
@@ -1,6 +1,7 @@
-/* GStreamer
+/* GStreamer byte reader
  *
  * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -162,6 +163,84 @@ guint    gst_byte_reader_masked_scan_uint32 (GstByteReader * reader,
  */
 #define GST_BYTE_READER_INIT_FROM_BUFFER(buffer) {GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 0}
 
+
+/* unchecked variants */
+
+static inline void
+gst_byte_reader_skip_unchecked (GstByteReader * reader, guint nbytes)
+{
+  reader->byte += nbytes;
+}
+
+#define __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(bits,type,lower,upper,adj) \
+\
+static inline type \
+gst_byte_reader_peek_##lower##_unchecked (GstByteReader * reader) \
+{ \
+  type val = (type) GST_READ_##upper (reader->data + reader->byte); \
+  adj \
+  return val; \
+} \
+\
+static inline type \
+gst_byte_reader_get_##lower##_unchecked (GstByteReader * reader) \
+{ \
+  type val = gst_byte_reader_peek_##lower##_unchecked (reader); \
+  reader->byte += bits / 8; \
+  return val; \
+}
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,guint8,uint8,UINT8,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,gint8,int8,UINT8,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_le,UINT16_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_be,UINT16_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_le,UINT16_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_be,UINT16_BE,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_le,UINT32_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_be,UINT32_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_le,UINT32_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_be,UINT32_BE,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_le,UINT24_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_be,UINT24_BE,/* */)
+
+/* fix up the sign for 24-bit signed ints stored in 32-bit signed ints */
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_le,UINT24_LE,
+    if (val & 0x00800000) val |= 0xff000000;)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_be,UINT24_BE,
+    if (val & 0x00800000) val |= 0xff000000;)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_le,UINT64_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_be,UINT64_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_le,UINT64_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_be,UINT64_BE,/* */)
+
+#undef __GET_PEEK_BITS_UNCHECKED
+
+static inline const guint8 *
+gst_byte_reader_peek_data_unchecked (GstByteReader * reader)
+{
+  return (const guint8 *) (reader->data + reader->byte);
+}
+
+static inline const guint8 *
+gst_byte_reader_get_data_unchecked (GstByteReader * reader, guint size)
+{
+  const guint8 *data;
+
+  data = gst_byte_reader_peek_data_unchecked (reader);
+  gst_byte_reader_skip_unchecked (reader, size);
+  return data;
+}
+
+static inline guint8 *
+gst_byte_reader_dup_data_unchecked (GstByteReader * reader, guint size)
+{
+  return g_memdup (gst_byte_reader_get_data_unchecked (reader, size), size);
+}
+
 G_END_DECLS
 
 #endif /* __GST_BYTE_READER_H__ */
index 97d7bc9..13b810f 100644 (file)
@@ -131,9 +131,9 @@ GST_START_TEST (test_get_uint_le)
   };
   GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
   guint8 a;
-  guint16 b;
-  guint32 c;
-  guint64 d;
+  guint16 b = 0;
+  guint32 c = 0;
+  guint64 d = 0;
 
   GET_CHECK8 (&reader, a, 0x12);
   GET_CHECK (&reader, b, 16, le, 0x5634);
@@ -174,9 +174,9 @@ GST_START_TEST (test_get_uint_be)
   };
   GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
   guint8 a;
-  guint16 b;
-  guint32 c;
-  guint64 d;
+  guint16 b = 0;
+  guint32 c = 0;
+  guint64 d = 0;
 
   GET_CHECK8 (&reader, a, 0x12);
   GET_CHECK (&reader, b, 16, be, 0x3456);
@@ -262,9 +262,9 @@ GST_START_TEST (test_get_int_le)
   };
   GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
   gint8 a;
-  gint16 b;
-  gint32 c;
-  gint64 d;
+  gint16 b = 0;
+  gint32 c = 0;
+  gint64 d = 0;
 
   GET_CHECK8 (&reader, a, -1);
   GET_CHECK (&reader, b, 16, le, -1);
@@ -306,9 +306,9 @@ GST_START_TEST (test_get_int_be)
   };
   GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
   gint8 a;
-  gint16 b;
-  gint32 c;
-  gint64 d;
+  gint16 b = 0;
+  gint32 c = 0;
+  gint64 d = 0;
 
   GET_CHECK8 (&reader, a, -1);
   GET_CHECK (&reader, b, 16, be, -1);
@@ -558,7 +558,7 @@ GST_START_TEST (test_string_funcs)
   guint32 *c32;
   guint16 *c16;
   gchar *c8;
-  guint8 data[200], *d;
+  guint8 data[200], *d = 0;
   guint i;
 
   /* fill half the buffer with a pattern */
@@ -664,8 +664,8 @@ GST_START_TEST (test_dup_string)
 {
   const gchar moredata[] = { 0x99, 0x10, 'f', '0', '0', '!', '\0', 0xff };
   GstByteReader reader;
-  guint16 num;
-  guint8 x;
+  guint16 num = 0;
+  guint8 x = 0;
   gchar *s;
 
   gst_byte_reader_init (&reader, (guint8 *) moredata, sizeof (moredata));