summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
Diffstat (limited to 'audio')
-rw-r--r--audio/format.c55
-rw-r--r--audio/format.h136
2 files changed, 96 insertions, 95 deletions
diff --git a/audio/format.c b/audio/format.c
index 01c9a431a1..b933d07e16 100644
--- a/audio/format.c
+++ b/audio/format.c
@@ -62,41 +62,30 @@ int af_fmt_change_bits(int format, int bits)
return af_fmt_is_valid(format) ? format : 0;
}
+#define FMT(string, id) \
+ {string, id},
+
+#define FMT_ENDIAN(string, id) \
+ {string, id}, \
+ {string "ne", id}, \
+ {string "le", MP_CONCAT(id, _LE)}, \
+ {string "be", MP_CONCAT(id, _BE)}, \
+
const struct af_fmt_entry af_fmtstr_table[] = {
- { "mpeg2", AF_FORMAT_MPEG2 },
- { "ac3le", AF_FORMAT_AC3_LE },
- { "ac3be", AF_FORMAT_AC3_BE },
- { "ac3ne", AF_FORMAT_AC3_NE },
- { "iec61937le", AF_FORMAT_IEC61937_LE },
- { "iec61937be", AF_FORMAT_IEC61937_BE },
- { "iec61937ne", AF_FORMAT_IEC61937_NE },
+ FMT("mpeg2", AF_FORMAT_MPEG2)
+ FMT_ENDIAN("ac3", AF_FORMAT_AC3)
+ FMT_ENDIAN("iec61937", AF_FORMAT_IEC61937)
- { "u8", AF_FORMAT_U8 },
- { "s8", AF_FORMAT_S8 },
- { "u16le", AF_FORMAT_U16_LE },
- { "u16be", AF_FORMAT_U16_BE },
- { "u16ne", AF_FORMAT_U16_NE },
- { "s16le", AF_FORMAT_S16_LE },
- { "s16be", AF_FORMAT_S16_BE },
- { "s16ne", AF_FORMAT_S16_NE },
- { "u24le", AF_FORMAT_U24_LE },
- { "u24be", AF_FORMAT_U24_BE },
- { "u24ne", AF_FORMAT_U24_NE },
- { "s24le", AF_FORMAT_S24_LE },
- { "s24be", AF_FORMAT_S24_BE },
- { "s24ne", AF_FORMAT_S24_NE },
- { "u32le", AF_FORMAT_U32_LE },
- { "u32be", AF_FORMAT_U32_BE },
- { "u32ne", AF_FORMAT_U32_NE },
- { "s32le", AF_FORMAT_S32_LE },
- { "s32be", AF_FORMAT_S32_BE },
- { "s32ne", AF_FORMAT_S32_NE },
- { "floatle", AF_FORMAT_FLOAT_LE },
- { "floatbe", AF_FORMAT_FLOAT_BE },
- { "floatne", AF_FORMAT_FLOAT_NE },
- { "doublele", AF_FORMAT_DOUBLE_LE },
- { "doublebe", AF_FORMAT_DOUBLE_BE },
- { "doublene", AF_FORMAT_DOUBLE_NE },
+ FMT("u8", AF_FORMAT_U8)
+ FMT("s8", AF_FORMAT_S8)
+ FMT_ENDIAN("u16", AF_FORMAT_U16)
+ FMT_ENDIAN("s16", AF_FORMAT_S16)
+ FMT_ENDIAN("u24", AF_FORMAT_U24)
+ FMT_ENDIAN("s24", AF_FORMAT_S24)
+ FMT_ENDIAN("u32", AF_FORMAT_U32)
+ FMT_ENDIAN("s32", AF_FORMAT_S32)
+ FMT_ENDIAN("float", AF_FORMAT_FLOAT)
+ FMT_ENDIAN("double", AF_FORMAT_DOUBLE)
{0}
};
diff --git a/audio/format.h b/audio/format.h
index 6ec435b6b7..3a80a601c5 100644
--- a/audio/format.h
+++ b/audio/format.h
@@ -27,16 +27,18 @@
#include "config.h"
#include "mpvcore/bstr.h"
+#if BYTE_ORDER == BIG_ENDIAN
+#define AF_SELECT_LE_BE(LE, BE) BE
+#else
+#define AF_SELECT_LE_BE(LE, BE) LE
+#endif
+
// Endianness
#define AF_FORMAT_BE (0<<0) // Big Endian
#define AF_FORMAT_LE (1<<0) // Little Endian
#define AF_FORMAT_END_MASK (1<<0)
-#if BYTE_ORDER == BIG_ENDIAN
-#define AF_FORMAT_NE AF_FORMAT_BE
-#else
-#define AF_FORMAT_NE AF_FORMAT_LE
-#endif
+#define AF_FORMAT_NE AF_SELECT_LE_BE(AF_FORMAT_LE, AF_FORMAT_BE)
// Signed/unsigned
#define AF_FORMAT_SI (0<<1) // Signed
@@ -52,9 +54,9 @@
#define AF_FORMAT_BITS_MASK (7<<3)
// Special flags refering to non pcm data (note: 1<<6, 2<<6, 5<<6 unused)
-#define AF_FORMAT_MPEG2 (3<<6) // MPEG(2) audio
-#define AF_FORMAT_AC3 (4<<6) // Dolby Digital AC3
-#define AF_FORMAT_IEC61937 (6<<6)
+#define AF_FORMAT_S_MPEG2 (3<<6) // MPEG(2) audio
+#define AF_FORMAT_S_AC3 (4<<6) // Dolby Digital AC3
+#define AF_FORMAT_S_IEC61937 (6<<6)
#define AF_FORMAT_SPECIAL_MASK (7<<6)
// Fixed or floating point
@@ -66,61 +68,71 @@
// PREDEFINED formats
-#define AF_FORMAT_U8 (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_8BIT|AF_FORMAT_NE)
-#define AF_FORMAT_S8 (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_8BIT|AF_FORMAT_NE)
-#define AF_FORMAT_U16_LE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_LE)
-#define AF_FORMAT_U16_BE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_BE)
-#define AF_FORMAT_S16_LE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_LE)
-#define AF_FORMAT_S16_BE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_BE)
-#define AF_FORMAT_U24_LE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_LE)
-#define AF_FORMAT_U24_BE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_BE)
-#define AF_FORMAT_S24_LE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_LE)
-#define AF_FORMAT_S24_BE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_BE)
-#define AF_FORMAT_U32_LE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_LE)
-#define AF_FORMAT_U32_BE (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_BE)
-#define AF_FORMAT_S32_LE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_LE)
-#define AF_FORMAT_S32_BE (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_BE)
-
-#define AF_FORMAT_FLOAT_LE (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_LE)
-#define AF_FORMAT_FLOAT_BE (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_BE)
-
-#define AF_FORMAT_DOUBLE_LE (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_LE)
-#define AF_FORMAT_DOUBLE_BE (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_BE)
-
-#define AF_FORMAT_AC3_LE (AF_FORMAT_AC3|AF_FORMAT_16BIT|AF_FORMAT_LE)
-#define AF_FORMAT_AC3_BE (AF_FORMAT_AC3|AF_FORMAT_16BIT|AF_FORMAT_BE)
-
-#define AF_FORMAT_IEC61937_LE (AF_FORMAT_IEC61937|AF_FORMAT_16BIT|AF_FORMAT_LE)
-#define AF_FORMAT_IEC61937_BE (AF_FORMAT_IEC61937|AF_FORMAT_16BIT|AF_FORMAT_BE)
-
-#if BYTE_ORDER == BIG_ENDIAN
-#define AF_FORMAT_U16_NE AF_FORMAT_U16_BE
-#define AF_FORMAT_S16_NE AF_FORMAT_S16_BE
-#define AF_FORMAT_U24_NE AF_FORMAT_U24_BE
-#define AF_FORMAT_S24_NE AF_FORMAT_S24_BE
-#define AF_FORMAT_U32_NE AF_FORMAT_U32_BE
-#define AF_FORMAT_S32_NE AF_FORMAT_S32_BE
-#define AF_FORMAT_FLOAT_NE AF_FORMAT_FLOAT_BE
-#define AF_FORMAT_DOUBLE_NE AF_FORMAT_DOUBLE_BE
-#define AF_FORMAT_AC3_NE AF_FORMAT_AC3_BE
-#define AF_FORMAT_IEC61937_NE AF_FORMAT_IEC61937_BE
-#else
-#define AF_FORMAT_U16_NE AF_FORMAT_U16_LE
-#define AF_FORMAT_S16_NE AF_FORMAT_S16_LE
-#define AF_FORMAT_U24_NE AF_FORMAT_U24_LE
-#define AF_FORMAT_S24_NE AF_FORMAT_S24_LE
-#define AF_FORMAT_U32_NE AF_FORMAT_U32_LE
-#define AF_FORMAT_S32_NE AF_FORMAT_S32_LE
-#define AF_FORMAT_FLOAT_NE AF_FORMAT_FLOAT_LE
-#define AF_FORMAT_DOUBLE_NE AF_FORMAT_DOUBLE_LE
-#define AF_FORMAT_AC3_NE AF_FORMAT_AC3_LE
-#define AF_FORMAT_IEC61937_NE AF_FORMAT_IEC61937_LE
-#endif
-
-#define AF_FORMAT_UNKNOWN 0
+// actual sample formats
+enum af_format {
+ AF_FORMAT_UNKNOWN = 0,
+
+ AF_FORMAT_U8 = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_8BIT|AF_FORMAT_NE),
+ AF_FORMAT_S8 = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_8BIT|AF_FORMAT_NE),
+ AF_FORMAT_U16_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_LE),
+ AF_FORMAT_U16_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_16BIT|AF_FORMAT_BE),
+ AF_FORMAT_S16_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_LE),
+ AF_FORMAT_S16_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_16BIT|AF_FORMAT_BE),
+ AF_FORMAT_U24_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_LE),
+ AF_FORMAT_U24_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_24BIT|AF_FORMAT_BE),
+ AF_FORMAT_S24_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_LE),
+ AF_FORMAT_S24_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_24BIT|AF_FORMAT_BE),
+ AF_FORMAT_U32_LE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_LE),
+ AF_FORMAT_U32_BE = (AF_FORMAT_I|AF_FORMAT_US|AF_FORMAT_32BIT|AF_FORMAT_BE),
+ AF_FORMAT_S32_LE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_LE),
+ AF_FORMAT_S32_BE = (AF_FORMAT_I|AF_FORMAT_SI|AF_FORMAT_32BIT|AF_FORMAT_BE),
+
+ AF_FORMAT_FLOAT_LE = (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_LE),
+ AF_FORMAT_FLOAT_BE = (AF_FORMAT_F|AF_FORMAT_32BIT|AF_FORMAT_BE),
+
+ AF_FORMAT_DOUBLE_LE = (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_LE),
+ AF_FORMAT_DOUBLE_BE = (AF_FORMAT_F|AF_FORMAT_64BIT|AF_FORMAT_BE),
+
+ AF_FORMAT_AC3_LE = (AF_FORMAT_S_AC3|AF_FORMAT_16BIT|AF_FORMAT_LE),
+ AF_FORMAT_AC3_BE = (AF_FORMAT_S_AC3|AF_FORMAT_16BIT|AF_FORMAT_BE),
+
+ AF_FORMAT_IEC61937_LE = (AF_FORMAT_S_IEC61937|AF_FORMAT_16BIT|AF_FORMAT_LE),
+ AF_FORMAT_IEC61937_BE = (AF_FORMAT_S_IEC61937|AF_FORMAT_16BIT|AF_FORMAT_BE),
+
+ AF_FORMAT_MPEG2 = (AF_FORMAT_S_MPEG2),
+
+ // Native endian variants
+ AF_FORMAT_U16 = AF_SELECT_LE_BE(AF_FORMAT_U16_LE, AF_FORMAT_U16_BE),
+ AF_FORMAT_S16 = AF_SELECT_LE_BE(AF_FORMAT_S16_LE, AF_FORMAT_S16_BE),
+ AF_FORMAT_U24 = AF_SELECT_LE_BE(AF_FORMAT_U24_LE, AF_FORMAT_U24_BE),
+ AF_FORMAT_S24 = AF_SELECT_LE_BE(AF_FORMAT_S24_LE, AF_FORMAT_S24_BE),
+ AF_FORMAT_U32 = AF_SELECT_LE_BE(AF_FORMAT_U32_LE, AF_FORMAT_U32_BE),
+ AF_FORMAT_S32 = AF_SELECT_LE_BE(AF_FORMAT_S32_LE, AF_FORMAT_S32_BE),
+
+ AF_FORMAT_FLOAT = AF_SELECT_LE_BE(AF_FORMAT_FLOAT_LE, AF_FORMAT_FLOAT_BE),
+ AF_FORMAT_DOUBLE = AF_SELECT_LE_BE(AF_FORMAT_DOUBLE_LE, AF_FORMAT_DOUBLE_BE),
+
+ AF_FORMAT_AC3 = AF_SELECT_LE_BE(AF_FORMAT_AC3_LE, AF_FORMAT_AC3_BE),
+ AF_FORMAT_IEC61937 = AF_SELECT_LE_BE(AF_FORMAT_IEC61937_LE, AF_FORMAT_IEC61937_BE),
+};
-#define AF_FORMAT_IS_AC3(fmt) (((fmt) & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_AC3)
-#define AF_FORMAT_IS_IEC61937(fmt) (AF_FORMAT_IS_AC3(fmt) || ((fmt) & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_IEC61937)
+#define AF_FORMAT_U16_NE AF_FORMAT_U16
+#define AF_FORMAT_S16_NE AF_FORMAT_S16
+#define AF_FORMAT_U24_NE AF_FORMAT_U24
+#define AF_FORMAT_S24_NE AF_FORMAT_S24
+#define AF_FORMAT_U32_NE AF_FORMAT_U32
+#define AF_FORMAT_S32_NE AF_FORMAT_S32
+#define AF_FORMAT_FLOAT_NE AF_FORMAT_FLOAT
+#define AF_FORMAT_DOUBLE_NE AF_FORMAT_DOUBLE
+#define AF_FORMAT_AC3_NE AF_FORMAT_AC3
+#define AF_FORMAT_IEC61937_NE AF_FORMAT_IEC61937
+
+#define AF_FORMAT_IS_AC3(fmt) \
+ (((fmt) & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_S_AC3)
+
+#define AF_FORMAT_IS_IEC61937(fmt) \
+ (AF_FORMAT_IS_AC3(fmt) || \
+ ((fmt) & AF_FORMAT_SPECIAL_MASK) == AF_FORMAT_S_IEC61937)
struct af_fmt_entry {
const char *name;