1 /* GStreamer byte reader
3 * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
4 * Copyright (C) 2009 Tim-Philipp Müller <tim centricular net>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
22 #ifndef __GST_BYTE_READER_H__
23 #define __GST_BYTE_READER_H__
26 #include <gst/base/base-prelude.h>
30 #define GST_BYTE_READER(reader) ((GstByteReader *) (reader))
34 * @data: (array length=size): Data from which the bit reader will
36 * @size: Size of @data in bytes
37 * @byte: Current byte position
39 * A byte reader instance.
45 guint byte; /* Byte position */
48 gpointer _gst_reserved[GST_PADDING];
52 GstByteReader * gst_byte_reader_new (const guint8 *data, guint size) G_GNUC_MALLOC;
55 void gst_byte_reader_free (GstByteReader *reader);
58 void gst_byte_reader_init (GstByteReader *reader, const guint8 *data, guint size);
61 gboolean gst_byte_reader_peek_sub_reader (GstByteReader * reader,
62 GstByteReader * sub_reader,
65 gboolean gst_byte_reader_get_sub_reader (GstByteReader * reader,
66 GstByteReader * sub_reader,
69 gboolean gst_byte_reader_set_pos (GstByteReader *reader, guint pos);
72 guint gst_byte_reader_get_pos (const GstByteReader *reader);
75 guint gst_byte_reader_get_remaining (const GstByteReader *reader);
78 guint gst_byte_reader_get_size (const GstByteReader *reader);
81 gboolean gst_byte_reader_skip (GstByteReader *reader, guint nbytes);
84 gboolean gst_byte_reader_get_uint8 (GstByteReader *reader, guint8 *val);
87 gboolean gst_byte_reader_get_int8 (GstByteReader *reader, gint8 *val);
90 gboolean gst_byte_reader_get_uint16_le (GstByteReader *reader, guint16 *val);
93 gboolean gst_byte_reader_get_int16_le (GstByteReader *reader, gint16 *val);
96 gboolean gst_byte_reader_get_uint16_be (GstByteReader *reader, guint16 *val);
99 gboolean gst_byte_reader_get_int16_be (GstByteReader *reader, gint16 *val);
102 gboolean gst_byte_reader_get_uint24_le (GstByteReader *reader, guint32 *val);
105 gboolean gst_byte_reader_get_int24_le (GstByteReader *reader, gint32 *val);
108 gboolean gst_byte_reader_get_uint24_be (GstByteReader *reader, guint32 *val);
111 gboolean gst_byte_reader_get_int24_be (GstByteReader *reader, gint32 *val);
114 gboolean gst_byte_reader_get_uint32_le (GstByteReader *reader, guint32 *val);
117 gboolean gst_byte_reader_get_int32_le (GstByteReader *reader, gint32 *val);
120 gboolean gst_byte_reader_get_uint32_be (GstByteReader *reader, guint32 *val);
123 gboolean gst_byte_reader_get_int32_be (GstByteReader *reader, gint32 *val);
126 gboolean gst_byte_reader_get_uint64_le (GstByteReader *reader, guint64 *val);
129 gboolean gst_byte_reader_get_int64_le (GstByteReader *reader, gint64 *val);
132 gboolean gst_byte_reader_get_uint64_be (GstByteReader *reader, guint64 *val);
135 gboolean gst_byte_reader_get_int64_be (GstByteReader *reader, gint64 *val);
138 gboolean gst_byte_reader_peek_uint8 (const GstByteReader *reader, guint8 *val);
141 gboolean gst_byte_reader_peek_int8 (const GstByteReader *reader, gint8 *val);
144 gboolean gst_byte_reader_peek_uint16_le (const GstByteReader *reader, guint16 *val);
147 gboolean gst_byte_reader_peek_int16_le (const GstByteReader *reader, gint16 *val);
150 gboolean gst_byte_reader_peek_uint16_be (const GstByteReader *reader, guint16 *val);
153 gboolean gst_byte_reader_peek_int16_be (const GstByteReader *reader, gint16 *val);
156 gboolean gst_byte_reader_peek_uint24_le (const GstByteReader *reader, guint32 *val);
159 gboolean gst_byte_reader_peek_int24_le (const GstByteReader *reader, gint32 *val);
162 gboolean gst_byte_reader_peek_uint24_be (const GstByteReader *reader, guint32 *val);
165 gboolean gst_byte_reader_peek_int24_be (const GstByteReader *reader, gint32 *val);
168 gboolean gst_byte_reader_peek_uint32_le (const GstByteReader *reader, guint32 *val);
171 gboolean gst_byte_reader_peek_int32_le (const GstByteReader *reader, gint32 *val);
174 gboolean gst_byte_reader_peek_uint32_be (const GstByteReader *reader, guint32 *val);
177 gboolean gst_byte_reader_peek_int32_be (const GstByteReader *reader, gint32 *val);
180 gboolean gst_byte_reader_peek_uint64_le (const GstByteReader *reader, guint64 *val);
183 gboolean gst_byte_reader_peek_int64_le (const GstByteReader *reader, gint64 *val);
186 gboolean gst_byte_reader_peek_uint64_be (const GstByteReader *reader, guint64 *val);
189 gboolean gst_byte_reader_peek_int64_be (const GstByteReader *reader, gint64 *val);
192 gboolean gst_byte_reader_get_float32_le (GstByteReader *reader, gfloat *val);
195 gboolean gst_byte_reader_get_float32_be (GstByteReader *reader, gfloat *val);
198 gboolean gst_byte_reader_get_float64_le (GstByteReader *reader, gdouble *val);
201 gboolean gst_byte_reader_get_float64_be (GstByteReader *reader, gdouble *val);
204 gboolean gst_byte_reader_peek_float32_le (const GstByteReader *reader, gfloat *val);
207 gboolean gst_byte_reader_peek_float32_be (const GstByteReader *reader, gfloat *val);
210 gboolean gst_byte_reader_peek_float64_le (const GstByteReader *reader, gdouble *val);
213 gboolean gst_byte_reader_peek_float64_be (const GstByteReader *reader, gdouble *val);
216 gboolean gst_byte_reader_dup_data (GstByteReader * reader, guint size, guint8 ** val);
219 gboolean gst_byte_reader_get_data (GstByteReader * reader, guint size, const guint8 ** val);
222 gboolean gst_byte_reader_peek_data (const GstByteReader * reader, guint size, const guint8 ** val);
224 #define gst_byte_reader_dup_string(reader,str) \
225 gst_byte_reader_dup_string_utf8(reader,str)
228 gboolean gst_byte_reader_dup_string_utf8 (GstByteReader * reader, gchar ** str);
231 gboolean gst_byte_reader_dup_string_utf16 (GstByteReader * reader, guint16 ** str);
234 gboolean gst_byte_reader_dup_string_utf32 (GstByteReader * reader, guint32 ** str);
236 #define gst_byte_reader_skip_string(reader) \
237 gst_byte_reader_skip_string_utf8(reader)
240 gboolean gst_byte_reader_skip_string_utf8 (GstByteReader * reader);
243 gboolean gst_byte_reader_skip_string_utf16 (GstByteReader * reader);
246 gboolean gst_byte_reader_skip_string_utf32 (GstByteReader * reader);
248 #define gst_byte_reader_get_string(reader,str) \
249 gst_byte_reader_get_string_utf8(reader,str)
251 #define gst_byte_reader_peek_string(reader,str) \
252 gst_byte_reader_peek_string_utf8(reader,str)
255 gboolean gst_byte_reader_get_string_utf8 (GstByteReader * reader, const gchar ** str);
258 gboolean gst_byte_reader_peek_string_utf8 (const GstByteReader * reader, const gchar ** str);
261 guint gst_byte_reader_masked_scan_uint32 (const GstByteReader * reader,
267 guint gst_byte_reader_masked_scan_uint32_peek (const GstByteReader * reader,
275 * GST_BYTE_READER_INIT:
276 * @data: Data from which the #GstByteReader should read
277 * @size: Size of @data in bytes
279 * A #GstByteReader must be initialized with this macro, before it can be
280 * used. This macro can used be to initialize a variable, but it cannot
281 * be assigned to a variable. In that case you have to use
282 * gst_byte_reader_init().
284 #define GST_BYTE_READER_INIT(data, size) {data, size, 0}
286 /* unchecked variants */
288 gst_byte_reader_skip_unchecked (GstByteReader * reader, guint nbytes)
290 reader->byte += nbytes;
293 #define __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(bits,type,lower,upper,adj) \
296 gst_byte_reader_peek_##lower##_unchecked (const GstByteReader * reader) \
298 type val = (type) GST_READ_##upper (reader->data + reader->byte); \
304 gst_byte_reader_get_##lower##_unchecked (GstByteReader * reader) \
306 type val = gst_byte_reader_peek_##lower##_unchecked (reader); \
307 reader->byte += bits / 8; \
311 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,guint8,uint8,UINT8,/* */)
312 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,gint8,int8,UINT8,/* */)
314 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_le,UINT16_LE,/* */)
315 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_be,UINT16_BE,/* */)
316 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_le,UINT16_LE,/* */)
317 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_be,UINT16_BE,/* */)
319 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_le,UINT32_LE,/* */)
320 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_be,UINT32_BE,/* */)
321 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_le,UINT32_LE,/* */)
322 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_be,UINT32_BE,/* */)
324 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_le,UINT24_LE,/* */)
325 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_be,UINT24_BE,/* */)
327 /* fix up the sign for 24-bit signed ints stored in 32-bit signed ints */
328 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_le,UINT24_LE,
329 if (val & 0x00800000) val |= 0xff000000;)
330 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_be,UINT24_BE,
331 if (val & 0x00800000) val |= 0xff000000;)
333 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_le,UINT64_LE,/* */)
334 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_be,UINT64_BE,/* */)
335 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_le,UINT64_LE,/* */)
336 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_be,UINT64_BE,/* */)
338 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gfloat,float32_le,FLOAT_LE,/* */)
339 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gfloat,float32_be,FLOAT_BE,/* */)
340 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gdouble,float64_le,DOUBLE_LE,/* */)
341 __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gdouble,float64_be,DOUBLE_BE,/* */)
343 #undef __GET_PEEK_BITS_UNCHECKED
345 static inline const guint8 *
346 gst_byte_reader_peek_data_unchecked (const GstByteReader * reader)
348 return (const guint8 *) (reader->data + reader->byte);
351 static inline const guint8 *
352 gst_byte_reader_get_data_unchecked (GstByteReader * reader, guint size)
356 data = gst_byte_reader_peek_data_unchecked (reader);
357 gst_byte_reader_skip_unchecked (reader, size);
361 static inline guint8 *
362 gst_byte_reader_dup_data_unchecked (GstByteReader * reader, guint size)
364 gconstpointer data = gst_byte_reader_get_data_unchecked (reader, size);
365 return (guint8 *) g_memdup (data, size);
368 /* Unchecked variants that should not be used */
370 _gst_byte_reader_get_pos_unchecked (const GstByteReader * reader)
376 _gst_byte_reader_get_remaining_unchecked (const GstByteReader * reader)
378 return reader->size - reader->byte;
382 _gst_byte_reader_get_size_unchecked (const GstByteReader * reader)
387 /* inlined variants (do not use directly) */
390 _gst_byte_reader_get_remaining_inline (const GstByteReader * reader)
392 g_return_val_if_fail (reader != NULL, 0);
394 return _gst_byte_reader_get_remaining_unchecked (reader);
398 _gst_byte_reader_get_size_inline (const GstByteReader * reader)
400 g_return_val_if_fail (reader != NULL, 0);
402 return _gst_byte_reader_get_size_unchecked (reader);
405 #define __GST_BYTE_READER_GET_PEEK_BITS_INLINE(bits,type,name) \
407 static inline gboolean \
408 _gst_byte_reader_peek_##name##_inline (const GstByteReader * reader, type * val) \
410 g_return_val_if_fail (reader != NULL, FALSE); \
411 g_return_val_if_fail (val != NULL, FALSE); \
413 if (_gst_byte_reader_get_remaining_unchecked (reader) < (bits / 8)) \
416 *val = gst_byte_reader_peek_##name##_unchecked (reader); \
420 static inline gboolean \
421 _gst_byte_reader_get_##name##_inline (GstByteReader * reader, type * val) \
423 g_return_val_if_fail (reader != NULL, FALSE); \
424 g_return_val_if_fail (val != NULL, FALSE); \
426 if (_gst_byte_reader_get_remaining_unchecked (reader) < (bits / 8)) \
429 *val = gst_byte_reader_get_##name##_unchecked (reader); \
433 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(8,guint8,uint8)
434 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(8,gint8,int8)
436 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,guint16,uint16_le)
437 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,guint16,uint16_be)
438 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,gint16,int16_le)
439 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,gint16,int16_be)
441 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,guint32,uint32_le)
442 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,guint32,uint32_be)
443 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gint32,int32_le)
444 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gint32,int32_be)
446 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,guint32,uint24_le)
447 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,guint32,uint24_be)
448 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,gint32,int24_le)
449 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,gint32,int24_be)
451 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,guint64,uint64_le)
452 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,guint64,uint64_be)
453 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gint64,int64_le)
454 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gint64,int64_be)
456 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gfloat,float32_le)
457 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gfloat,float32_be)
458 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gdouble,float64_le)
459 __GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gdouble,float64_be)
461 #undef __GST_BYTE_READER_GET_PEEK_BITS_INLINE
463 #ifndef GST_BYTE_READER_DISABLE_INLINES
465 #define gst_byte_reader_init(reader,data,size) \
466 _gst_byte_reader_init_inline(reader,data,size)
468 #define gst_byte_reader_get_remaining(reader) \
469 _gst_byte_reader_get_remaining_inline(reader)
471 #define gst_byte_reader_get_size(reader) \
472 _gst_byte_reader_get_size_inline(reader)
474 #define gst_byte_reader_get_pos(reader) \
475 _gst_byte_reader_get_pos_inline(reader)
477 /* we use defines here so we can add the G_LIKELY() */
478 #define gst_byte_reader_get_uint8(reader,val) \
479 G_LIKELY(_gst_byte_reader_get_uint8_inline(reader,val))
480 #define gst_byte_reader_get_int8(reader,val) \
481 G_LIKELY(_gst_byte_reader_get_int8_inline(reader,val))
482 #define gst_byte_reader_get_uint16_le(reader,val) \
483 G_LIKELY(_gst_byte_reader_get_uint16_le_inline(reader,val))
484 #define gst_byte_reader_get_int16_le(reader,val) \
485 G_LIKELY(_gst_byte_reader_get_int16_le_inline(reader,val))
486 #define gst_byte_reader_get_uint16_be(reader,val) \
487 G_LIKELY(_gst_byte_reader_get_uint16_be_inline(reader,val))
488 #define gst_byte_reader_get_int16_be(reader,val) \
489 G_LIKELY(_gst_byte_reader_get_int16_be_inline(reader,val))
490 #define gst_byte_reader_get_uint24_le(reader,val) \
491 G_LIKELY(_gst_byte_reader_get_uint24_le_inline(reader,val))
492 #define gst_byte_reader_get_int24_le(reader,val) \
493 G_LIKELY(_gst_byte_reader_get_int24_le_inline(reader,val))
494 #define gst_byte_reader_get_uint24_be(reader,val) \
495 G_LIKELY(_gst_byte_reader_get_uint24_be_inline(reader,val))
496 #define gst_byte_reader_get_int24_be(reader,val) \
497 G_LIKELY(_gst_byte_reader_get_int24_be_inline(reader,val))
498 #define gst_byte_reader_get_uint32_le(reader,val) \
499 G_LIKELY(_gst_byte_reader_get_uint32_le_inline(reader,val))
500 #define gst_byte_reader_get_int32_le(reader,val) \
501 G_LIKELY(_gst_byte_reader_get_int32_le_inline(reader,val))
502 #define gst_byte_reader_get_uint32_be(reader,val) \
503 G_LIKELY(_gst_byte_reader_get_uint32_be_inline(reader,val))
504 #define gst_byte_reader_get_int32_be(reader,val) \
505 G_LIKELY(_gst_byte_reader_get_int32_be_inline(reader,val))
506 #define gst_byte_reader_get_uint64_le(reader,val) \
507 G_LIKELY(_gst_byte_reader_get_uint64_le_inline(reader,val))
508 #define gst_byte_reader_get_int64_le(reader,val) \
509 G_LIKELY(_gst_byte_reader_get_int64_le_inline(reader,val))
510 #define gst_byte_reader_get_uint64_be(reader,val) \
511 G_LIKELY(_gst_byte_reader_get_uint64_be_inline(reader,val))
512 #define gst_byte_reader_get_int64_be(reader,val) \
513 G_LIKELY(_gst_byte_reader_get_int64_be_inline(reader,val))
515 #define gst_byte_reader_peek_uint8(reader,val) \
516 G_LIKELY(_gst_byte_reader_peek_uint8_inline(reader,val))
517 #define gst_byte_reader_peek_int8(reader,val) \
518 G_LIKELY(_gst_byte_reader_peek_int8_inline(reader,val))
519 #define gst_byte_reader_peek_uint16_le(reader,val) \
520 G_LIKELY(_gst_byte_reader_peek_uint16_le_inline(reader,val))
521 #define gst_byte_reader_peek_int16_le(reader,val) \
522 G_LIKELY(_gst_byte_reader_peek_int16_le_inline(reader,val))
523 #define gst_byte_reader_peek_uint16_be(reader,val) \
524 G_LIKELY(_gst_byte_reader_peek_uint16_be_inline(reader,val))
525 #define gst_byte_reader_peek_int16_be(reader,val) \
526 G_LIKELY(_gst_byte_reader_peek_int16_be_inline(reader,val))
527 #define gst_byte_reader_peek_uint24_le(reader,val) \
528 G_LIKELY(_gst_byte_reader_peek_uint24_le_inline(reader,val))
529 #define gst_byte_reader_peek_int24_le(reader,val) \
530 G_LIKELY(_gst_byte_reader_peek_int24_le_inline(reader,val))
531 #define gst_byte_reader_peek_uint24_be(reader,val) \
532 G_LIKELY(_gst_byte_reader_peek_uint24_be_inline(reader,val))
533 #define gst_byte_reader_peek_int24_be(reader,val) \
534 G_LIKELY(_gst_byte_reader_peek_int24_be_inline(reader,val))
535 #define gst_byte_reader_peek_uint32_le(reader,val) \
536 G_LIKELY(_gst_byte_reader_peek_uint32_le_inline(reader,val))
537 #define gst_byte_reader_peek_int32_le(reader,val) \
538 G_LIKELY(_gst_byte_reader_peek_int32_le_inline(reader,val))
539 #define gst_byte_reader_peek_uint32_be(reader,val) \
540 G_LIKELY(_gst_byte_reader_peek_uint32_be_inline(reader,val))
541 #define gst_byte_reader_peek_int32_be(reader,val) \
542 G_LIKELY(_gst_byte_reader_peek_int32_be_inline(reader,val))
543 #define gst_byte_reader_peek_uint64_le(reader,val) \
544 G_LIKELY(_gst_byte_reader_peek_uint64_le_inline(reader,val))
545 #define gst_byte_reader_peek_int64_le(reader,val) \
546 G_LIKELY(_gst_byte_reader_peek_int64_le_inline(reader,val))
547 #define gst_byte_reader_peek_uint64_be(reader,val) \
548 G_LIKELY(_gst_byte_reader_peek_uint64_be_inline(reader,val))
549 #define gst_byte_reader_peek_int64_be(reader,val) \
550 G_LIKELY(_gst_byte_reader_peek_int64_be_inline(reader,val))
552 #define gst_byte_reader_get_float32_le(reader,val) \
553 G_LIKELY(_gst_byte_reader_get_float32_le_inline(reader,val))
554 #define gst_byte_reader_get_float32_be(reader,val) \
555 G_LIKELY(_gst_byte_reader_get_float32_be_inline(reader,val))
556 #define gst_byte_reader_get_float64_le(reader,val) \
557 G_LIKELY(_gst_byte_reader_get_float64_le_inline(reader,val))
558 #define gst_byte_reader_get_float64_be(reader,val) \
559 G_LIKELY(_gst_byte_reader_get_float64_be_inline(reader,val))
560 #define gst_byte_reader_peek_float32_le(reader,val) \
561 G_LIKELY(_gst_byte_reader_peek_float32_le_inline(reader,val))
562 #define gst_byte_reader_peek_float32_be(reader,val) \
563 G_LIKELY(_gst_byte_reader_peek_float32_be_inline(reader,val))
564 #define gst_byte_reader_peek_float64_le(reader,val) \
565 G_LIKELY(_gst_byte_reader_peek_float64_le_inline(reader,val))
566 #define gst_byte_reader_peek_float64_be(reader,val) \
567 G_LIKELY(_gst_byte_reader_peek_float64_be_inline(reader,val))
569 #endif /* GST_BYTE_READER_DISABLE_INLINES */
572 _gst_byte_reader_init_inline (GstByteReader * reader, const guint8 * data, guint size)
574 g_return_if_fail (reader != NULL);
581 static inline gboolean
582 _gst_byte_reader_peek_sub_reader_inline (GstByteReader * reader,
583 GstByteReader * sub_reader, guint size)
585 g_return_val_if_fail (reader != NULL, FALSE);
586 g_return_val_if_fail (sub_reader != NULL, FALSE);
588 if (_gst_byte_reader_get_remaining_unchecked (reader) < size)
591 sub_reader->data = reader->data + reader->byte;
592 sub_reader->byte = 0;
593 sub_reader->size = size;
597 static inline gboolean
598 _gst_byte_reader_get_sub_reader_inline (GstByteReader * reader,
599 GstByteReader * sub_reader, guint size)
601 if (!_gst_byte_reader_peek_sub_reader_inline (reader, sub_reader, size))
603 gst_byte_reader_skip_unchecked (reader, size);
607 static inline gboolean
608 _gst_byte_reader_dup_data_inline (GstByteReader * reader, guint size, guint8 ** val)
610 g_return_val_if_fail (reader != NULL, FALSE);
611 g_return_val_if_fail (val != NULL, FALSE);
613 if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_unchecked (reader) < size))
616 *val = gst_byte_reader_dup_data_unchecked (reader, size);
620 static inline gboolean
621 _gst_byte_reader_get_data_inline (GstByteReader * reader, guint size, const guint8 ** val)
623 g_return_val_if_fail (reader != NULL, FALSE);
624 g_return_val_if_fail (val != NULL, FALSE);
626 if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_unchecked (reader) < size))
629 *val = gst_byte_reader_get_data_unchecked (reader, size);
633 static inline gboolean
634 _gst_byte_reader_peek_data_inline (const GstByteReader * reader, guint size, const guint8 ** val)
636 g_return_val_if_fail (reader != NULL, FALSE);
637 g_return_val_if_fail (val != NULL, FALSE);
639 if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_unchecked (reader) < size))
642 *val = gst_byte_reader_peek_data_unchecked (reader);
647 _gst_byte_reader_get_pos_inline (const GstByteReader * reader)
649 g_return_val_if_fail (reader != NULL, 0);
651 return _gst_byte_reader_get_pos_unchecked (reader);
654 static inline gboolean
655 _gst_byte_reader_skip_inline (GstByteReader * reader, guint nbytes)
657 g_return_val_if_fail (reader != NULL, FALSE);
659 if (G_UNLIKELY (_gst_byte_reader_get_remaining_unchecked (reader) < nbytes))
662 reader->byte += nbytes;
666 #ifndef GST_BYTE_READER_DISABLE_INLINES
668 #define gst_byte_reader_dup_data(reader,size,val) \
669 G_LIKELY(_gst_byte_reader_dup_data_inline(reader,size,val))
670 #define gst_byte_reader_get_data(reader,size,val) \
671 G_LIKELY(_gst_byte_reader_get_data_inline(reader,size,val))
672 #define gst_byte_reader_peek_data(reader,size,val) \
673 G_LIKELY(_gst_byte_reader_peek_data_inline(reader,size,val))
674 #define gst_byte_reader_skip(reader,nbytes) \
675 G_LIKELY(_gst_byte_reader_skip_inline(reader,nbytes))
677 #endif /* GST_BYTE_READER_DISABLE_INLINES */
681 #endif /* __GST_BYTE_READER_H__ */