bytereader: add inlined _unchecked() variants for some functions

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()
This commit is contained in:
Tim-Philipp Müller 2009-09-02 11:20:04 +01:00
parent 741a946134
commit 080b2e4fd5
6 changed files with 722 additions and 294 deletions

View 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>

View 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

View file

@ -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);

View 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,13 +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; \
*val = gst_byte_reader_get_##name##_unchecked (reader); \
return TRUE; \
} \
\
gboolean \
gst_byte_reader_get_uint##bits##_be (GstByteReader *reader, guint##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); \
@ -713,282 +713,32 @@ gst_byte_reader_get_uint##bits##_be (GstByteReader *reader, guint##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_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; \
return TRUE; \
} \
\
gboolean \
gst_byte_reader_get_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]); \
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;
}

View 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__ */

View 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));