bitreader: Optimize peek_bits/get_bits a bit

Use local variables instead of dereferencing the bitreader
pointer all the time and don't copy the reader for peek_bits.
This commit is contained in:
Sebastian Dröge 2010-10-03 14:24:00 +02:00
parent dd53349ad2
commit c41c2f7964

View file

@ -373,27 +373,33 @@ gst_bit_reader_skip_to_byte (GstBitReader * reader)
#define GST_BIT_READER_READ_BITS(bits) \ #define GST_BIT_READER_READ_BITS(bits) \
gboolean \ gboolean \
gst_bit_reader_get_bits_uint##bits (GstBitReader *reader, guint##bits *val, guint nbits) \ gst_bit_reader_peek_bits_uint##bits (const GstBitReader *reader, guint##bits *val, guint nbits) \
{ \ { \
guint##bits ret = 0; \ guint##bits ret = 0; \
const guint8 *data; \
guint byte, bit; \
\ \
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); \
g_return_val_if_fail (nbits <= bits, FALSE); \ g_return_val_if_fail (nbits <= bits, FALSE); \
\ \
if (reader->byte * 8 + reader->bit + nbits > reader->size * 8) \ data = reader->data; \
byte = reader->byte; \
bit = reader->bit; \
\
if (byte * 8 + bit + nbits > reader->size * 8) \
return FALSE; \ return FALSE; \
\ \
while (nbits > 0) { \ while (nbits > 0) { \
guint toread = MIN (nbits, 8 - reader->bit); \ guint toread = MIN (nbits, 8 - bit); \
\ \
ret <<= toread; \ ret <<= toread; \
ret |= (reader->data[reader->byte] & (0xff >> reader->bit)) >> (8 - toread - reader->bit); \ ret |= (data[byte] & (0xff >> bit)) >> (8 - toread - bit); \
\ \
reader->bit += toread; \ bit += toread; \
if (reader->bit >= 8) { \ if (bit >= 8) { \
reader->byte++; \ byte++; \
reader->bit = 0; \ bit = 0; \
} \ } \
nbits -= toread; \ nbits -= toread; \
} \ } \
@ -403,13 +409,21 @@ gst_bit_reader_get_bits_uint##bits (GstBitReader *reader, guint##bits *val, guin
} \ } \
\ \
gboolean \ gboolean \
gst_bit_reader_peek_bits_uint##bits (const GstBitReader *reader, guint##bits *val, guint nbits) \ gst_bit_reader_get_bits_uint##bits (GstBitReader *reader, guint##bits *val, guint nbits) \
{ \ { \
GstBitReader tmp; \ gboolean ret; \
\ \
g_return_val_if_fail (reader != NULL, FALSE); \ ret = gst_bit_reader_peek_bits_uint##bits (reader, val, nbits); \
tmp = *reader; \ \
return gst_bit_reader_get_bits_uint##bits (&tmp, val, nbits); \ if (ret) { \
reader->bit += nbits; \
if (reader->bit >= 8) { \
reader->byte += reader->bit / 8; \
reader->bit = reader->bit % 8; \
} \
} \
\
return ret; \
} }
GST_BIT_READER_READ_BITS (8); GST_BIT_READER_READ_BITS (8);