mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-31 11:32:38 +00:00
gstutils: Faster read macros
On platforms that can do unaligned read/write, we can read/write much faster by just casting. https://bugzilla.gnome.org/show_bug.cgi?id=599546
This commit is contained in:
parent
502ee3d092
commit
915ca4685c
1 changed files with 86 additions and 29 deletions
|
@ -26,6 +26,7 @@
|
||||||
#define __GST_UTILS_H__
|
#define __GST_UTILS_H__
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <gst/gstconfig.h>
|
||||||
#include <gst/gstbin.h>
|
#include <gst/gstbin.h>
|
||||||
#include <gst/gstparse.h>
|
#include <gst/gstparse.h>
|
||||||
|
|
||||||
|
@ -114,13 +115,53 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
#define _GST_PUT(__data, __idx, __size, __shift, __num) \
|
#define _GST_PUT(__data, __idx, __size, __shift, __num) \
|
||||||
(((guint8 *) (__data))[__idx] = (((guint##__size) (__num)) >> (__shift)) & 0xff)
|
(((guint8 *) (__data))[__idx] = (((guint##__size) (__num)) >> (__shift)) & 0xff)
|
||||||
|
|
||||||
|
#if GST_HAVE_UNALIGNED_ACCESS
|
||||||
|
static inline guint16 __gst_fast_read16(const guint8 *v) {
|
||||||
|
return *(const guint16*)(v);
|
||||||
|
}
|
||||||
|
static inline guint32 __gst_fast_read32(const guint8 *v) {
|
||||||
|
return *(const guint32*)(v);
|
||||||
|
}
|
||||||
|
static inline guint64 __gst_fast_read64(const guint8 *v) {
|
||||||
|
return *(const guint64*)(v);
|
||||||
|
}
|
||||||
|
static inline guint16 __gst_fast_read_swap16(const guint8 *v) {
|
||||||
|
return GUINT16_SWAP_LE_BE(*(const guint16*)(v));
|
||||||
|
}
|
||||||
|
static inline guint32 __gst_fast_read_swap32(const guint8 *v) {
|
||||||
|
return GUINT32_SWAP_LE_BE(*(const guint32*)(v));
|
||||||
|
}
|
||||||
|
static inline guint64 __gst_fast_read_swap64(const guint8 *v) {
|
||||||
|
return GUINT64_SWAP_LE_BE(*(const guint64*)(v));
|
||||||
|
}
|
||||||
|
# define _GST_FAST_READ(s, d) __gst_fast_read##s((const guint8 *)(d))
|
||||||
|
# define _GST_FAST_READ_SWAP(s, d) __gst_fast_read_swap##s((const guint8 *)(d))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT64_BE:
|
* GST_READ_UINT64_BE:
|
||||||
* @data: memory location
|
* @data: memory location
|
||||||
*
|
*
|
||||||
* Read a 64 bit unsigned integer value in big endian format from the memory buffer.
|
* Read a 64 bit unsigned integer value in big endian format from the memory buffer.
|
||||||
*/
|
*/
|
||||||
#define GST_READ_UINT64_BE(data) (_GST_GET (data, 0, 64, 56) | \
|
|
||||||
|
/**
|
||||||
|
* GST_READ_UINT64_LE:
|
||||||
|
* @data: memory location
|
||||||
|
*
|
||||||
|
* Read a 64 bit unsigned integer value in little endian format from the memory buffer.
|
||||||
|
*/
|
||||||
|
#if GST_HAVE_UNALIGNED_ACCESS
|
||||||
|
# if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
# define GST_READ_UINT64_BE(data) _GST_FAST_READ (64, data)
|
||||||
|
# define GST_READ_UINT64_LE(data) _GST_FAST_READ_SWAP (64, data)
|
||||||
|
# else
|
||||||
|
# define GST_READ_UINT64_BE(data) _GST_FAST_READ_SWAP (64, data)
|
||||||
|
# define GST_READ_UINT64_LE(data) _GST_FAST_READ (64, data)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GST_READ_UINT64_BE(data) (_GST_GET (data, 0, 64, 56) | \
|
||||||
_GST_GET (data, 1, 64, 48) | \
|
_GST_GET (data, 1, 64, 48) | \
|
||||||
_GST_GET (data, 2, 64, 40) | \
|
_GST_GET (data, 2, 64, 40) | \
|
||||||
_GST_GET (data, 3, 64, 32) | \
|
_GST_GET (data, 3, 64, 32) | \
|
||||||
|
@ -129,13 +170,7 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
_GST_GET (data, 6, 64, 8) | \
|
_GST_GET (data, 6, 64, 8) | \
|
||||||
_GST_GET (data, 7, 64, 0))
|
_GST_GET (data, 7, 64, 0))
|
||||||
|
|
||||||
/**
|
# define GST_READ_UINT64_LE(data) (_GST_GET (data, 7, 64, 56) | \
|
||||||
* GST_READ_UINT64_LE:
|
|
||||||
* @data: memory location
|
|
||||||
*
|
|
||||||
* Read a 64 bit unsigned integer value in little endian format from the memory buffer.
|
|
||||||
*/
|
|
||||||
#define GST_READ_UINT64_LE(data) (_GST_GET (data, 7, 64, 56) | \
|
|
||||||
_GST_GET (data, 6, 64, 48) | \
|
_GST_GET (data, 6, 64, 48) | \
|
||||||
_GST_GET (data, 5, 64, 40) | \
|
_GST_GET (data, 5, 64, 40) | \
|
||||||
_GST_GET (data, 4, 64, 32) | \
|
_GST_GET (data, 4, 64, 32) | \
|
||||||
|
@ -143,6 +178,7 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
_GST_GET (data, 2, 64, 16) | \
|
_GST_GET (data, 2, 64, 16) | \
|
||||||
_GST_GET (data, 1, 64, 8) | \
|
_GST_GET (data, 1, 64, 8) | \
|
||||||
_GST_GET (data, 0, 64, 0))
|
_GST_GET (data, 0, 64, 0))
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT32_BE:
|
* GST_READ_UINT32_BE:
|
||||||
|
@ -150,10 +186,6 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
*
|
*
|
||||||
* Read a 32 bit unsigned integer value in big endian format from the memory buffer.
|
* Read a 32 bit unsigned integer value in big endian format from the memory buffer.
|
||||||
*/
|
*/
|
||||||
#define GST_READ_UINT32_BE(data) (_GST_GET (data, 0, 32, 24) | \
|
|
||||||
_GST_GET (data, 1, 32, 16) | \
|
|
||||||
_GST_GET (data, 2, 32, 8) | \
|
|
||||||
_GST_GET (data, 3, 32, 0))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT32_LE:
|
* GST_READ_UINT32_LE:
|
||||||
|
@ -161,10 +193,25 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
*
|
*
|
||||||
* Read a 32 bit unsigned integer value in little endian format from the memory buffer.
|
* Read a 32 bit unsigned integer value in little endian format from the memory buffer.
|
||||||
*/
|
*/
|
||||||
#define GST_READ_UINT32_LE(data) (_GST_GET (data, 3, 32, 24) | \
|
#if GST_HAVE_UNALIGNED_ACCESS
|
||||||
|
# if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
# define GST_READ_UINT32_BE(data) _GST_FAST_READ (32, data)
|
||||||
|
# define GST_READ_UINT32_LE(data) _GST_FAST_READ_SWAP (32, data)
|
||||||
|
# else
|
||||||
|
# define GST_READ_UINT32_BE(data) _GST_FAST_READ_SWAP (32, data)
|
||||||
|
# define GST_READ_UINT32_LE(data) _GST_FAST_READ (32, data)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GST_READ_UINT32_BE(data) (_GST_GET (data, 0, 32, 24) | \
|
||||||
|
_GST_GET (data, 1, 32, 16) | \
|
||||||
|
_GST_GET (data, 2, 32, 8) | \
|
||||||
|
_GST_GET (data, 3, 32, 0))
|
||||||
|
|
||||||
|
# define GST_READ_UINT32_LE(data) (_GST_GET (data, 3, 32, 24) | \
|
||||||
_GST_GET (data, 2, 32, 16) | \
|
_GST_GET (data, 2, 32, 16) | \
|
||||||
_GST_GET (data, 1, 32, 8) | \
|
_GST_GET (data, 1, 32, 8) | \
|
||||||
_GST_GET (data, 0, 32, 0))
|
_GST_GET (data, 0, 32, 0))
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT24_BE:
|
* GST_READ_UINT24_BE:
|
||||||
|
@ -196,17 +243,27 @@ void gst_print_element_args (GString *buf, gint indent, GstE
|
||||||
*
|
*
|
||||||
* Read a 16 bit unsigned integer value in big endian format from the memory buffer.
|
* Read a 16 bit unsigned integer value in big endian format from the memory buffer.
|
||||||
*/
|
*/
|
||||||
#define GST_READ_UINT16_BE(data) (_GST_GET (data, 0, 16, 8) | \
|
|
||||||
_GST_GET (data, 1, 16, 0))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT16_LE:
|
* GST_READ_UINT16_LE:
|
||||||
* @data: memory location
|
* @data: memory location
|
||||||
*
|
*
|
||||||
* Read a 16 bit unsigned integer value in little endian format from the memory buffer.
|
* Read a 16 bit unsigned integer value in little endian format from the memory buffer.
|
||||||
*/
|
*/
|
||||||
#define GST_READ_UINT16_LE(data) (_GST_GET (data, 1, 16, 8) | \
|
#if GST_HAVE_UNALIGNED_ACCESS
|
||||||
|
# if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||||
|
# define GST_READ_UINT16_BE(data) _GST_FAST_READ (16, data)
|
||||||
|
# define GST_READ_UINT16_LE(data) _GST_FAST_READ_SWAP (16, data)
|
||||||
|
# else
|
||||||
|
# define GST_READ_UINT16_BE(data) _GST_FAST_READ_SWAP (16, data)
|
||||||
|
# define GST_READ_UINT16_LE(data) _GST_FAST_READ (16, data)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GST_READ_UINT16_BE(data) (_GST_GET (data, 0, 16, 8) | \
|
||||||
|
_GST_GET (data, 1, 16, 0))
|
||||||
|
|
||||||
|
# define GST_READ_UINT16_LE(data) (_GST_GET (data, 1, 16, 8) | \
|
||||||
_GST_GET (data, 0, 16, 0))
|
_GST_GET (data, 0, 16, 0))
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_READ_UINT8:
|
* GST_READ_UINT8:
|
||||||
|
|
Loading…
Reference in a new issue