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_utf8
gst_byte_reader_skip_string_utf16 gst_byte_reader_skip_string_utf16
gst_byte_reader_skip_string_utf32 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>
<SECTION> <SECTION>

View file

@ -33,6 +33,9 @@ libgstbase_@GST_MAJORMINOR@include_HEADERS = \
gsttypefindhelper.h \ gsttypefindhelper.h \
gstdataqueue.h gstdataqueue.h
noinst_HEADERS = \
gstbytereader-docs.h
CLEANFILES = *.gcno *.gcda *.gcov CLEANFILES = *.gcno *.gcda *.gcov
%.c.gcov: .libs/libgstbase_@GST_MAJORMINOR@_la-%.gcda %.c %.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) 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * 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 * Since: 0.10.22
*/ */
#define GST_BYTE_READER_READ_INTS(bits) \ #define GST_BYTE_READER_PEEK_GET_INTS(bits,type,name) \
gboolean \ 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 (reader != NULL, FALSE); \
g_return_val_if_fail (val != 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) \ if (gst_byte_reader_get_remaining (reader) < bits / 8) \
return FALSE; \ return FALSE; \
\ \
*val = GST_READ_UINT##bits##_LE (&reader->data[reader->byte]); \ *val = gst_byte_reader_get_##name##_unchecked (reader); \
reader->byte += bits / 8; \
return TRUE; \ return TRUE; \
} \ } \
\ \
gboolean \ 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 (reader != NULL, FALSE); \
g_return_val_if_fail (val != 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) \ if (gst_byte_reader_get_remaining (reader) < bits / 8) \
return FALSE; \ return FALSE; \
\ \
*val = GST_READ_UINT##bits##_BE (&reader->data[reader->byte]); \ *val = gst_byte_reader_peek_##name##_unchecked (reader); \
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]); \
return TRUE; \ 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_PEEK_GET_INTS(16,guint16,uint16_le)
GST_BYTE_READER_READ_INTS (32); GST_BYTE_READER_PEEK_GET_INTS(16,guint16,uint16_be)
GST_BYTE_READER_READ_INTS (64); GST_BYTE_READER_PEEK_GET_INTS(16,gint16,int16_le)
GST_BYTE_READER_PEEK_GET_INTS(16,gint16,int16_be)
gboolean GST_BYTE_READER_PEEK_GET_INTS(24,guint32,uint24_le)
gst_byte_reader_get_uint8 (GstByteReader * reader, guint8 * val) GST_BYTE_READER_PEEK_GET_INTS(24,guint32,uint24_be)
{ GST_BYTE_READER_PEEK_GET_INTS(24,gint32,int24_le)
g_return_val_if_fail (reader != NULL, FALSE); GST_BYTE_READER_PEEK_GET_INTS(24,gint32,int24_be)
g_return_val_if_fail (val != NULL, FALSE);
if (reader->byte >= reader->size) GST_BYTE_READER_PEEK_GET_INTS(32,guint32,uint32_le)
return FALSE; 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]); GST_BYTE_READER_PEEK_GET_INTS(64,guint64,uint64_le)
reader->byte++; GST_BYTE_READER_PEEK_GET_INTS(64,guint64,uint64_be)
return TRUE; GST_BYTE_READER_PEEK_GET_INTS(64,gint64,int64_le)
} GST_BYTE_READER_PEEK_GET_INTS(64,gint64,int64_be)
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_get_float32_le: * 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) if (gst_byte_reader_get_remaining (reader) < size)
return FALSE; return FALSE;
*val = reader->data + reader->byte; *val = gst_byte_reader_get_data_unchecked (reader, size);
reader->byte += size;
return TRUE; return TRUE;
} }
@ -1204,7 +953,7 @@ gst_byte_reader_peek_data (GstByteReader * reader, guint size,
if (gst_byte_reader_get_remaining (reader) < size) if (gst_byte_reader_get_remaining (reader) < size)
return FALSE; return FALSE;
*val = reader->data + reader->byte; *val = gst_byte_reader_peek_data_unchecked (reader);
return TRUE; 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) 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * 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} #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 G_END_DECLS
#endif /* __GST_BYTE_READER_H__ */ #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); GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
guint8 a; guint8 a;
guint16 b; guint16 b = 0;
guint32 c; guint32 c = 0;
guint64 d; guint64 d = 0;
GET_CHECK8 (&reader, a, 0x12); GET_CHECK8 (&reader, a, 0x12);
GET_CHECK (&reader, b, 16, le, 0x5634); 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); GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
guint8 a; guint8 a;
guint16 b; guint16 b = 0;
guint32 c; guint32 c = 0;
guint64 d; guint64 d = 0;
GET_CHECK8 (&reader, a, 0x12); GET_CHECK8 (&reader, a, 0x12);
GET_CHECK (&reader, b, 16, be, 0x3456); 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); GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
gint8 a; gint8 a;
gint16 b; gint16 b = 0;
gint32 c; gint32 c = 0;
gint64 d; gint64 d = 0;
GET_CHECK8 (&reader, a, -1); GET_CHECK8 (&reader, a, -1);
GET_CHECK (&reader, b, 16, le, -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); GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
gint8 a; gint8 a;
gint16 b; gint16 b = 0;
gint32 c; gint32 c = 0;
gint64 d; gint64 d = 0;
GET_CHECK8 (&reader, a, -1); GET_CHECK8 (&reader, a, -1);
GET_CHECK (&reader, b, 16, be, -1); GET_CHECK (&reader, b, 16, be, -1);
@ -558,7 +558,7 @@ GST_START_TEST (test_string_funcs)
guint32 *c32; guint32 *c32;
guint16 *c16; guint16 *c16;
gchar *c8; gchar *c8;
guint8 data[200], *d; guint8 data[200], *d = 0;
guint i; guint i;
/* fill half the buffer with a pattern */ /* 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 }; const gchar moredata[] = { 0x99, 0x10, 'f', '0', '0', '!', '\0', 0xff };
GstByteReader reader; GstByteReader reader;
guint16 num; guint16 num = 0;
guint8 x; guint8 x = 0;
gchar *s; gchar *s;
gst_byte_reader_init (&reader, (guint8 *) moredata, sizeof (moredata)); gst_byte_reader_init (&reader, (guint8 *) moredata, sizeof (moredata));