audio: add orc enabled pack and unpack functions
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 8 Jun 2012 15:48:11 +0000 (17:48 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 8 Jun 2012 15:57:43 +0000 (17:57 +0200)
gst-libs/gst/audio/Makefile.am
gst-libs/gst/audio/audio-format.c
gst-libs/gst/audio/gstaudiopack.orc [new file with mode: 0644]

index 37012fe..6c18297 100644 (file)
@@ -1,4 +1,7 @@
 # variables used for enum/marshal generation
+ORC_SOURCE=gstaudiopack
+include $(top_srcdir)/common/orc.mak
+
 glib_enum_headers=             \
        audio.h                 \
        audio-format.h                  \
@@ -12,7 +15,7 @@ glib_gen_basename = audio
 
 built_sources = audio-enumtypes.c
 built_headers = audio-enumtypes.h
-BUILT_SOURCES = $(built_sources) $(built_headers)
+BUILT_SOURCES += $(built_sources) $(built_headers)
 
 lib_LTLIBRARIES = \
        libgstaudio-@GST_API_VERSION@.la
@@ -63,10 +66,11 @@ libgstaudio_@GST_API_VERSION@include_HEADERS = \
 nodist_libgstaudio_@GST_API_VERSION@include_HEADERS = \
        audio-enumtypes.h
 
-libgstaudio_@GST_API_VERSION@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstaudio_@GST_API_VERSION@_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) \
+               $(ORC_CFLAGS)
 libgstaudio_@GST_API_VERSION@_la_LIBADD = \
   $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_API_VERSION@.la \
-  $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
+  $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ORC_LIBS)
 libgstaudio_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
 
 include $(top_srcdir)/common/gst-glib-gen.mak
index 7a59816..45575b8 100644 (file)
 
 #include "audio-format.h"
 
+#include "gstaudiopack.h"
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define orc_unpack_s16le orc_unpack_s16
+# define orc_unpack_s16be orc_unpack_s16_swap
+# define orc_unpack_u16le orc_unpack_u16
+# define orc_unpack_u16be orc_unpack_u16_swap
+# define orc_unpack_s24_32le orc_unpack_s24_32
+# define orc_unpack_s24_32be orc_unpack_s24_32_swap
+# define orc_unpack_u24_32le orc_unpack_u24_32
+# define orc_unpack_u24_32be orc_unpack_u24_32_swap
+# define orc_unpack_s32le orc_unpack_s32
+# define orc_unpack_s32be orc_unpack_s32_swap
+# define orc_unpack_u32le orc_unpack_u32
+# define orc_unpack_u32be orc_unpack_u32_swap
+# define orc_unpack_f32le orc_unpack_f32
+# define orc_unpack_f32be orc_unpack_f32_swap
+# define orc_unpack_f64le orc_unpack_f64
+# define orc_unpack_f64be orc_unpack_f64_swap
+# define orc_pack_s16le orc_pack_s16
+# define orc_pack_s16be orc_pack_s16_swap
+# define orc_pack_u16le orc_pack_u16
+# define orc_pack_u16be orc_pack_u16_swap
+# define orc_pack_s24_32le orc_pack_s24_32
+# define orc_pack_s24_32be orc_pack_s24_32_swap
+# define orc_pack_u24_32le orc_pack_u24_32
+# define orc_pack_u24_32be orc_pack_u24_32_swap
+# define orc_pack_s32le orc_pack_s32
+# define orc_pack_s32be orc_pack_s32_swap
+# define orc_pack_u32le orc_pack_u32
+# define orc_pack_u32be orc_pack_u32_swap
+# define orc_pack_f32le orc_pack_f32
+# define orc_pack_f32be orc_pack_f32_swap
+# define orc_pack_f64le orc_pack_f64
+# define orc_pack_f64be orc_pack_f64_swap
+#else
+# define orc_unpack_s16le orc_unpack_s16_swap
+# define orc_unpack_s16be orc_unpack_s16
+# define orc_unpack_u16le orc_unpack_u16_swap
+# define orc_unpack_u16be orc_unpack_u16
+# define orc_unpack_s24_32le orc_unpack_s24_32_swap
+# define orc_unpack_s24_32be orc_unpack_s24_32
+# define orc_unpack_u24_32le orc_unpack_u24_32_swap
+# define orc_unpack_u24_32be orc_unpack_u24_32
+# define orc_unpack_s32le orc_unpack_s32_swap
+# define orc_unpack_s32be orc_unpack_s32
+# define orc_unpack_u32le orc_unpack_u32_swap
+# define orc_unpack_u32be orc_unpack_u32
+# define orc_unpack_f32le orc_unpack_f32_swap
+# define orc_unpack_f32be orc_unpack_f32
+# define orc_unpack_f64le orc_unpack_f64_swap
+# define orc_unpack_f64be orc_unpack_f64
+# define orc_pack_s16le orc_pack_s16_swap
+# define orc_pack_s16be orc_pack_s16
+# define orc_pack_u16le orc_pack_u16_swap
+# define orc_pack_u16be orc_pack_u16
+# define orc_pack_s24_32le orc_pack_s24_32_swap
+# define orc_pack_s24_32be orc_pack_s24_32
+# define orc_pack_u24_32le orc_pack_u24_32_swap
+# define orc_pack_u24_32be orc_pack_u24_32
+# define orc_pack_s32le orc_pack_s32_swap
+# define orc_pack_s32be orc_pack_s32
+# define orc_pack_u32le orc_pack_u32_swap
+# define orc_pack_u32be orc_pack_u32
+# define orc_pack_f32le orc_pack_f32_swap
+# define orc_pack_f32be orc_pack_f32
+# define orc_pack_f64le orc_pack_f64_swap
+# define orc_pack_f64be orc_pack_f64
+#endif
+
+#define MAKE_ORC_PACK_UNPACK(fmt) \
+static void unpack_ ##fmt (const GstAudioFormatInfo *info, \
+    GstAudioPackFlags flags, gpointer dest,                \
+    const gpointer data, gint length) {                    \
+  orc_unpack_ ##fmt (dest, data, length);                  \
+}                                                          \
+static void pack_ ##fmt (const GstAudioFormatInfo *info,   \
+    GstAudioPackFlags flags, const gpointer src,           \
+    gpointer data, gint length) {                          \
+  orc_pack_ ##fmt (data, src, length);                     \
+}
+
+#define PACK_S8 GST_AUDIO_FORMAT_S32, unpack_s8, pack_s8
+MAKE_ORC_PACK_UNPACK (s8)
+#define PACK_U8 GST_AUDIO_FORMAT_S32, unpack_u8, pack_u8
+    MAKE_ORC_PACK_UNPACK (u8)
+#define PACK_S16LE GST_AUDIO_FORMAT_S32, unpack_s16le, pack_s16le
+    MAKE_ORC_PACK_UNPACK (s16le)
+#define PACK_S16BE GST_AUDIO_FORMAT_S32, unpack_s16be, pack_s16be
+    MAKE_ORC_PACK_UNPACK (s16be)
+#define PACK_U16LE GST_AUDIO_FORMAT_S32, unpack_u16le, pack_u16le
+    MAKE_ORC_PACK_UNPACK (u16le)
+#define PACK_U16BE GST_AUDIO_FORMAT_S32, unpack_u16be, pack_u16be
+    MAKE_ORC_PACK_UNPACK (u16be)
+#define PACK_S24_32LE GST_AUDIO_FORMAT_S32, unpack_s24_32le, pack_s24_32le
+    MAKE_ORC_PACK_UNPACK (s24_32le)
+#define PACK_S24_32BE GST_AUDIO_FORMAT_S32, unpack_s24_32be, pack_s24_32be
+    MAKE_ORC_PACK_UNPACK (s24_32be)
+#define PACK_U24_32LE GST_AUDIO_FORMAT_S32, unpack_u24_32le, pack_u24_32le
+    MAKE_ORC_PACK_UNPACK (u24_32le)
+#define PACK_U24_32BE GST_AUDIO_FORMAT_S32, unpack_u24_32be, pack_u24_32be
+    MAKE_ORC_PACK_UNPACK (u24_32be)
+#define PACK_S32LE GST_AUDIO_FORMAT_S32, unpack_s32le, pack_s32le
+    MAKE_ORC_PACK_UNPACK (s32le)
+#define PACK_S32BE GST_AUDIO_FORMAT_S32, unpack_s32be, pack_s32be
+    MAKE_ORC_PACK_UNPACK (s32be)
+#define PACK_U32LE GST_AUDIO_FORMAT_S32, unpack_u32le, pack_u32le
+    MAKE_ORC_PACK_UNPACK (u32le)
+#define PACK_U32BE GST_AUDIO_FORMAT_S32, unpack_u32be, pack_u32be
+    MAKE_ORC_PACK_UNPACK (u32be)
+#define SIGNED  (1U<<31)
+/* pack from signed integer 32 to integer */
+#define WRITE24_TO_LE(p,v) p[0] = v & 0xff; p[1] = (v >> 8) & 0xff; p[2] = (v >> 16) & 0xff
+#define WRITE24_TO_BE(p,v) p[2] = v & 0xff; p[1] = (v >> 8) & 0xff; p[0] = (v >> 16) & 0xff
+#define READ24_FROM_LE(p) (p[0] | (p[1] << 8) | (p[2] << 16))
+#define READ24_FROM_BE(p) (p[2] | (p[1] << 8) | (p[0] << 16))
+#define MAKE_PACK_UNPACK(name, stride, sign, scale, READ_FUNC, WRITE_FUNC)     \
+static void unpack_ ##name (const GstAudioFormatInfo *info,             \
+    GstAudioPackFlags flags, gpointer dest,                             \
+    const gpointer data, gint length)                                   \
+{                                                                       \
+  guint32 *d = dest;                                                    \
+  guint8 *s = data;                                                     \
+  for (;length; length--) {                                             \
+    *d++ = (((gint32) READ_FUNC (s)) << scale) ^ (sign);                \
+    s += stride;                                                        \
+  }                                                                     \
+}                                                                       \
+static void pack_ ##name (const GstAudioFormatInfo *info,               \
+    GstAudioPackFlags flags, const gpointer src,                        \
+    gpointer data, gint length)                                         \
+{                                                                       \
+  gint32 tmp;                                                           \
+  guint32 *s = src;                                                     \
+  guint8 *d = data;                                                     \
+  for (;length; length--) {                                             \
+    tmp = (*s++ ^ (sign)) >> scale;                                     \
+    WRITE_FUNC (d, tmp);                                                \
+    d += stride;                                                        \
+  }                                                                     \
+}
+#define PACK_S24LE GST_AUDIO_FORMAT_S32, unpack_s24le, pack_s24le
+    MAKE_PACK_UNPACK (s24le, 3, 0, 8, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_U24LE GST_AUDIO_FORMAT_S32, unpack_u24le, pack_u24le
+    MAKE_PACK_UNPACK (u24le, 3, SIGNED, 8, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_S24BE GST_AUDIO_FORMAT_S32, unpack_s24be, pack_s24be
+    MAKE_PACK_UNPACK (s24be, 3, 0, 8, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_U24BE GST_AUDIO_FORMAT_S32, unpack_u24be, pack_u24be
+    MAKE_PACK_UNPACK (u24be, 3, SIGNED, 8, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_S20LE GST_AUDIO_FORMAT_S32, unpack_s20le, pack_s20le
+    MAKE_PACK_UNPACK (s20le, 3, 0, 12, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_U20LE GST_AUDIO_FORMAT_S32, unpack_u20le, pack_u20le
+    MAKE_PACK_UNPACK (u20le, 3, SIGNED, 12, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_S20BE GST_AUDIO_FORMAT_S32, unpack_s20be, pack_s20be
+    MAKE_PACK_UNPACK (s20be, 3, 0, 12, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_U20BE GST_AUDIO_FORMAT_S32, unpack_u20be, pack_u20be
+    MAKE_PACK_UNPACK (u20be, 3, SIGNED, 12, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_S18LE GST_AUDIO_FORMAT_S32, unpack_s18le, pack_s18le
+    MAKE_PACK_UNPACK (s18le, 3, 0, 12, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_U18LE GST_AUDIO_FORMAT_S32, unpack_u18le, pack_u18le
+    MAKE_PACK_UNPACK (u18le, 3, SIGNED, 12, READ24_FROM_LE, WRITE24_TO_LE)
+#define PACK_S18BE GST_AUDIO_FORMAT_S32, unpack_s18be, pack_s18be
+    MAKE_PACK_UNPACK (s18be, 3, 0, 12, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_U18BE GST_AUDIO_FORMAT_S32, unpack_u18be, pack_u18be
+    MAKE_PACK_UNPACK (u18be, 3, SIGNED, 12, READ24_FROM_BE, WRITE24_TO_BE)
+#define PACK_F32LE GST_AUDIO_FORMAT_F64, unpack_f32le, pack_f32le
+    MAKE_ORC_PACK_UNPACK (f32le)
+#define PACK_F32BE GST_AUDIO_FORMAT_F64, unpack_f32be, pack_f32be
+    MAKE_ORC_PACK_UNPACK (f32be)
+#define PACK_F64LE GST_AUDIO_FORMAT_F64, unpack_f64le, pack_f64le
+    MAKE_ORC_PACK_UNPACK (f64le)
+#define PACK_F64BE GST_AUDIO_FORMAT_F64, unpack_f64be, pack_f64be
+    MAKE_ORC_PACK_UNPACK (f64be)
 #define SINT (GST_AUDIO_FORMAT_FLAG_INTEGER | GST_AUDIO_FORMAT_FLAG_SIGNED)
 #define SINT_PACK (SINT | GST_AUDIO_FORMAT_FLAG_UNPACK)
 #define UINT (GST_AUDIO_FORMAT_FLAG_INTEGER)
 #define FLOAT (GST_AUDIO_FORMAT_FLAG_FLOAT)
 #define FLOAT_PACK (FLOAT | GST_AUDIO_FORMAT_FLAG_UNPACK)
-
-#define MAKE_FORMAT(str,desc,flags,end,width,depth,silent) \
-  { GST_AUDIO_FORMAT_ ##str, G_STRINGIFY(str), desc, flags, end, width, depth, silent }
-
+#define MAKE_FORMAT(str,desc,flags,end,width,depth,silent, pack) \
+  { GST_AUDIO_FORMAT_ ##str, G_STRINGIFY(str), desc, flags, end, width, depth, silent, pack }
 #define SILENT_0         { 0, 0, 0, 0, 0, 0, 0, 0 }
 #define SILENT_U8        { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }
 #define SILENT_U16LE     { 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80 }
 #define SILENT_U20BE     { 0x08, 0x00, 0x00, 0x08, 0x00, 0x00 }
 #define SILENT_U18LE     { 0x00, 0x00, 0x02, 0x00, 0x00, 0x02 }
 #define SILENT_U18BE     { 0x02, 0x00, 0x00, 0x02, 0x00, 0x00 }
-
-static GstAudioFormatInfo formats[] = {
-  {GST_AUDIO_FORMAT_UNKNOWN, "UNKNOWN", "Unknown audio", 0, 0, 0, 0},
-  {GST_AUDIO_FORMAT_ENCODED, "ENCODED", "Encoded audio",
-      GST_AUDIO_FORMAT_FLAG_COMPLEX, 0, 0, 0},
-  /* 8 bit */
-  MAKE_FORMAT (S8, "8-bit signed PCM audio", SINT, 0, 8, 8, SILENT_0),
-  MAKE_FORMAT (U8, "8-bit unsigned PCM audio", UINT, 0, 8, 8, SILENT_U8),
-  /* 16 bit */
-  MAKE_FORMAT (S16LE, "16-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 16, 16,
-      SILENT_0),
-  MAKE_FORMAT (S16BE, "16-bit signed PCM audio", SINT, G_BIG_ENDIAN, 16, 16,
-      SILENT_0),
-  MAKE_FORMAT (U16LE, "16-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 16,
-      16, SILENT_U16LE),
-  MAKE_FORMAT (U16BE, "16-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 16, 16,
-      SILENT_U16BE),
-  /* 24 bit in low 3 bytes of 32 bits */
-  MAKE_FORMAT (S24_32LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 32,
-      24, SILENT_0),
-  MAKE_FORMAT (S24_32BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32, 24,
-      SILENT_0),
-  MAKE_FORMAT (U24_32LE, "24-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 32,
-      24, SILENT_U24_32LE),
-  MAKE_FORMAT (U24_32BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 32,
-      24, SILENT_U24_32BE),
-  /* 32 bit */
+     static GstAudioFormatInfo formats[] = {
+       {GST_AUDIO_FORMAT_UNKNOWN, "UNKNOWN", "Unknown audio", 0, 0, 0, 0},
+       {GST_AUDIO_FORMAT_ENCODED, "ENCODED", "Encoded audio",
+           GST_AUDIO_FORMAT_FLAG_COMPLEX, 0, 0, 0},
+       /* 8 bit */
+       MAKE_FORMAT (S8, "8-bit signed PCM audio", SINT, 0, 8, 8, SILENT_0,
+           PACK_S8),
+       MAKE_FORMAT (U8, "8-bit unsigned PCM audio", UINT, 0, 8, 8, SILENT_U8,
+           PACK_U8),
+       /* 16 bit */
+       MAKE_FORMAT (S16LE, "16-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 16,
+           16,
+           SILENT_0, PACK_S16LE),
+       MAKE_FORMAT (S16BE, "16-bit signed PCM audio", SINT, G_BIG_ENDIAN, 16,
+           16,
+           SILENT_0, PACK_S16BE),
+       MAKE_FORMAT (U16LE, "16-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN,
+           16,
+           16, SILENT_U16LE, PACK_U16LE),
+       MAKE_FORMAT (U16BE, "16-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 16,
+           16,
+           SILENT_U16BE, PACK_U16BE),
+       /* 24 bit in low 3 bytes of 32 bits */
+       MAKE_FORMAT (S24_32LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN,
+           32,
+           24, SILENT_0, PACK_S24_32LE),
+       MAKE_FORMAT (S24_32BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32,
+           24,
+           SILENT_0, PACK_S24_32BE),
+       MAKE_FORMAT (U24_32LE, "24-bit unsigned PCM audio", UINT,
+           G_LITTLE_ENDIAN, 32,
+           24, SILENT_U24_32LE, PACK_U24_32LE),
+       MAKE_FORMAT (U24_32BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN,
+           32,
+           24, SILENT_U24_32BE, PACK_U24_32BE),
+       /* 32 bit */
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
-  MAKE_FORMAT (S32LE, "32-bit signed PCM audio", SINT_PACK, G_LITTLE_ENDIAN, 32,
-      32,
-      SILENT_0),
-  MAKE_FORMAT (S32BE, "32-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32, 32,
-      SILENT_0),
+       MAKE_FORMAT (S32LE, "32-bit signed PCM audio", SINT_PACK,
+           G_LITTLE_ENDIAN, 32,
+           32, SILENT_0, PACK_S32LE),
+       MAKE_FORMAT (S32BE, "32-bit signed PCM audio", SINT, G_BIG_ENDIAN, 32,
+           32,
+           SILENT_0, PACK_S32BE),
 #else
-  MAKE_FORMAT (S32LE, "32-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 32, 32,
-      SILENT_0),
-  MAKE_FORMAT (S32BE, "32-bit signed PCM audio", SINT_PACK, G_BIG_ENDIAN, 32,
-      32,
-      SILENT_0),
+       MAKE_FORMAT (S32LE, "32-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 32,
+           32,
+           SILENT_0, PACK_S32LE),
+       MAKE_FORMAT (S32BE, "32-bit signed PCM audio", SINT_PACK, G_BIG_ENDIAN,
+           32,
+           32,
+           SILENT_0, PACK_S32BE),
 #endif
-  MAKE_FORMAT (U32LE, "32-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 32,
-      32, SILENT_U32LE),
-  MAKE_FORMAT (U32BE, "32-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 32, 32,
-      SILENT_U32BE),
-  /* 24 bit in 3 bytes */
-  MAKE_FORMAT (S24LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 24,
-      SILENT_0),
-  MAKE_FORMAT (S24BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 24,
-      SILENT_0),
-  MAKE_FORMAT (U24LE, "24-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
-      24, SILENT_U24LE),
-  MAKE_FORMAT (U24BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 24,
-      SILENT_U24BE),
-  /* 20 bit in 3 bytes */
-  MAKE_FORMAT (S20LE, "20-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 20,
-      SILENT_0),
-  MAKE_FORMAT (S20BE, "20-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 20,
-      SILENT_0),
-  MAKE_FORMAT (U20LE, "20-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
-      20, SILENT_U20LE),
-  MAKE_FORMAT (U20BE, "20-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 20,
-      SILENT_U20BE),
-  /* 18 bit in 3 bytes */
-  MAKE_FORMAT (S18LE, "18-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24, 18,
-      SILENT_0),
-  MAKE_FORMAT (S18BE, "18-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24, 18,
-      SILENT_0),
-  MAKE_FORMAT (U18LE, "18-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN, 24,
-      18, SILENT_U18LE),
-  MAKE_FORMAT (U18BE, "18-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24, 18,
-      SILENT_U18BE),
-  /* float */
-  MAKE_FORMAT (F32LE, "32-bit floating-point audio",
-      GST_AUDIO_FORMAT_FLAG_FLOAT, G_LITTLE_ENDIAN, 32, 32, SILENT_0),
-  MAKE_FORMAT (F32BE, "32-bit floating-point audio",
-      GST_AUDIO_FORMAT_FLAG_FLOAT, G_BIG_ENDIAN, 32, 32, SILENT_0),
+       MAKE_FORMAT (U32LE, "32-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN,
+           32,
+           32, SILENT_U32LE, PACK_U32LE),
+       MAKE_FORMAT (U32BE, "32-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 32,
+           32,
+           SILENT_U32BE, PACK_U32BE),
+       /* 24 bit in 3 bytes */
+       MAKE_FORMAT (S24LE, "24-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24,
+           24,
+           SILENT_0, PACK_S24LE),
+       MAKE_FORMAT (S24BE, "24-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24,
+           24,
+           SILENT_0, PACK_S24BE),
+       MAKE_FORMAT (U24LE, "24-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN,
+           24,
+           24, SILENT_U24LE, PACK_U24LE),
+       MAKE_FORMAT (U24BE, "24-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24,
+           24,
+           SILENT_U24BE, PACK_U24BE),
+       /* 20 bit in 3 bytes */
+       MAKE_FORMAT (S20LE, "20-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24,
+           20,
+           SILENT_0, PACK_S20LE),
+       MAKE_FORMAT (S20BE, "20-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24,
+           20,
+           SILENT_0, PACK_S20BE),
+       MAKE_FORMAT (U20LE, "20-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN,
+           24,
+           20, SILENT_U20LE, PACK_U20LE),
+       MAKE_FORMAT (U20BE, "20-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24,
+           20,
+           SILENT_U20BE, PACK_U20BE),
+       /* 18 bit in 3 bytes */
+       MAKE_FORMAT (S18LE, "18-bit signed PCM audio", SINT, G_LITTLE_ENDIAN, 24,
+           18,
+           SILENT_0, PACK_S18LE),
+       MAKE_FORMAT (S18BE, "18-bit signed PCM audio", SINT, G_BIG_ENDIAN, 24,
+           18,
+           SILENT_0, PACK_S18BE),
+       MAKE_FORMAT (U18LE, "18-bit unsigned PCM audio", UINT, G_LITTLE_ENDIAN,
+           24,
+           18, SILENT_U18LE, PACK_U18LE),
+       MAKE_FORMAT (U18BE, "18-bit unsigned PCM audio", UINT, G_BIG_ENDIAN, 24,
+           18,
+           SILENT_U18BE, PACK_U18BE),
+       /* float */
+       MAKE_FORMAT (F32LE, "32-bit floating-point audio",
+           GST_AUDIO_FORMAT_FLAG_FLOAT, G_LITTLE_ENDIAN, 32, 32, SILENT_0,
+           PACK_F32LE),
+       MAKE_FORMAT (F32BE, "32-bit floating-point audio",
+           GST_AUDIO_FORMAT_FLAG_FLOAT, G_BIG_ENDIAN, 32, 32, SILENT_0,
+           PACK_F32BE),
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
-  MAKE_FORMAT (F64LE, "64-bit floating-point audio",
-      FLOAT_PACK, G_LITTLE_ENDIAN, 64, 64, SILENT_0),
-  MAKE_FORMAT (F64BE, "64-bit floating-point audio",
-      FLOAT, G_BIG_ENDIAN, 64, 64, SILENT_0)
+       MAKE_FORMAT (F64LE, "64-bit floating-point audio",
+           FLOAT_PACK, G_LITTLE_ENDIAN, 64, 64, SILENT_0, PACK_F64LE),
+       MAKE_FORMAT (F64BE, "64-bit floating-point audio",
+           FLOAT, G_BIG_ENDIAN, 64, 64, SILENT_0, PACK_F64BE)
 #else
-  MAKE_FORMAT (F64LE, "64-bit floating-point audio",
-      FLOAT, G_LITTLE_ENDIAN, 64, 64, SILENT_0),
-  MAKE_FORMAT (F64BE, "64-bit floating-point audio",
-      FLOAT_PACK, G_BIG_ENDIAN, 64, 64, SILENT_0)
+       MAKE_FORMAT (F64LE, "64-bit floating-point audio",
+           FLOAT, G_LITTLE_ENDIAN, 64, 64, SILENT_0, PACK_F64LE),
+       MAKE_FORMAT (F64BE, "64-bit floating-point audio",
+           FLOAT_PACK, G_BIG_ENDIAN, 64, 64, SILENT_0, PACK_F64BE)
 #endif
-};
+     };
 
 G_DEFINE_POINTER_TYPE (GstAudioFormatInfo, gst_audio_format_info);
 
diff --git a/gst-libs/gst/audio/gstaudiopack.orc b/gst-libs/gst/audio/gstaudiopack.orc
new file mode 100644 (file)
index 0000000..a6c1342
--- /dev/null
@@ -0,0 +1,338 @@
+
+.function orc_unpack_u8
+.dest 4 d1 gint32
+.source 1 s1 guint8
+.const 4 c1 0x80000000
+.const 4 c2 24
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll t3, t3, c2
+xorl d1, t3, c1
+
+
+.function orc_unpack_s8
+.dest 4 d1 gint32
+.source 1 s1 guint8
+.const 4 c1 24
+.temp 2 t2
+.temp 4 t3
+
+convubw t2, s1
+convuwl t3, t2
+shll d1, t3, c1
+
+
+.function orc_unpack_u16
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.const 4 c2 16
+.const 4 c1 0x80000000
+.temp 4 t2
+
+convuwl t2, s1
+shll t2, t2, c2
+xorl d1, t2, c1
+
+
+.function orc_unpack_s16
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.const 4 c1 16
+.temp 4 t2
+
+convuwl t2, s1
+shll d1, t2, c1
+
+
+.function orc_unpack_u16_swap
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.const 4 c2 16
+.const 4 c1 0x80000000
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll t2, t2, c2
+xorl d1, t2, c1
+
+
+.function orc_unpack_s16_swap
+.dest 4 d1 gint32
+.source 2 s1 guint8
+.const 4 c1 16
+.temp 2 t1
+.temp 4 t2
+
+swapw t1, s1
+convuwl t2, t1
+shll d1, t2, c1
+
+.function orc_unpack_u24_32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c2 8
+.const 4 c1 0x80000000
+.temp 4 t1
+
+shll t1, s1, c2
+xorl d1, t1, c1
+
+
+.function orc_unpack_s24_32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c1 8
+
+shll d1, s1, c1
+
+
+.function orc_unpack_u24_32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c2 8
+.const 4 c1 0x80000000
+.temp 4 t1
+
+swapl t1, s1
+shll t1, t1, c2
+xorl d1, t1, c1
+
+
+.function orc_unpack_s24_32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c1 8
+.temp 4 t1
+
+swapl t1, s1
+shll d1, t1, c1
+
+
+.function orc_unpack_u32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c1 0x80000000
+
+xorl d1, s1, c1
+
+
+.function orc_unpack_u32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+.const 4 c1 0x80000000
+.temp 4 t1
+
+swapl t1, s1
+xorl d1, t1, c1
+
+.function orc_unpack_s32
+.dest 4 d1 gint32
+.source 4 s1 guint8
+
+copyl d1, s1
+
+.function orc_unpack_s32_swap
+.dest 4 d1 gint32
+.source 4 s1 guint8
+
+swapl d1, s1
+
+.function orc_unpack_f32
+.dest 8 d1 gdouble
+.source 4 s1 gfloat
+
+convfd d1, s1
+
+.function orc_unpack_f32_swap
+.dest 8 d1 gdouble
+.source 4 s1 gfloat
+.temp 4 t1
+
+swapl t1, s1
+convfd d1, t1
+
+.function orc_unpack_f64
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+copyq d1, s1
+
+.function orc_unpack_f64_swap
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+swapq d1, s1
+
+.function orc_pack_u8
+.dest 1 d1 guint8
+.source 4 s1 gint32
+.const 4 c2 24
+.const 4 c1 0x80000000
+.temp 4 t1
+.temp 2 t2
+
+xorl t1, s1, c1
+shrul t1, t1, c2
+convlw t2, t1
+convwb d1, t2
+
+
+.function orc_pack_s8
+.dest 1 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 24
+.temp 4 t1
+.temp 2 t2
+
+shrsl t1, s1, c1
+convlw t2, t1
+convwb d1, t2
+
+
+.function orc_pack_u16
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.const 4 c2 16
+.const 4 c1 0x80000000
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul t1, t1, c2
+convlw d1, t1
+
+
+.function orc_pack_s16
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 16
+.temp 4 t1
+
+shrsl t1, s1, c1
+convlw d1, t1
+
+
+.function orc_pack_u16_swap
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 0x80000000
+.const 4 c2 16
+.temp 4 t1
+.temp 2 t2
+
+xorl t1, s1, c1
+shrul t1, t1, c2
+convlw t2, t1
+swapw d1, t2
+
+
+.function orc_pack_s16_swap
+.dest 2 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 16
+.temp 4 t1
+.temp 2 t2
+
+shrsl t1, s1, c1
+convlw t2, t1
+swapw d1, t2
+
+.function orc_pack_u24_32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 0x80000000
+.const 4 c2 8
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul d1, t1, c2
+
+
+.function orc_pack_s24_32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 8
+
+shrsl d1, s1, c1
+
+
+.function orc_pack_u24_32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 0x80000000
+.const 4 c2 8
+.temp 4 t1
+
+xorl t1, s1, c1
+shrul t1, t1, c2
+swapl d1, t1
+
+
+.function orc_pack_s24_32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 8
+.temp 4 t1
+
+shrsl t1, s1, c1
+swapl d1, t1
+
+
+.function orc_pack_u32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 0x80000000
+
+xorl d1, s1, c1
+
+
+.function orc_pack_s32
+.dest 4 d1 guint8
+.source 4 s1 gint32
+
+copyl d1, s1
+
+
+.function orc_pack_u32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+.const 4 c1 0x80000000
+
+xorl d1, s1, c1
+
+
+.function orc_pack_s32_swap
+.dest 4 d1 guint8
+.source 4 s1 gint32
+
+swapl d1, s1
+
+.function orc_pack_f32
+.dest 4 d1 gfloat
+.source 8 s1 gdouble
+
+convdf d1, s1
+
+.function orc_pack_f32_swap
+.dest 4 d1 gfloat
+.source 8 s1 gdouble
+.temp 4 t1
+
+convdf t1, s1
+swapl d1, t1
+
+.function orc_pack_f64
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+copyq d1, s1
+
+.function orc_pack_f64_swap
+.dest 8 d1 gdouble
+.source 8 s1 gdouble
+
+swapq d1, s1