mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 17:52:29 +00:00
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:
parent
dd53349ad2
commit
c41c2f7964
1 changed files with 27 additions and 13 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue