diff options
Diffstat (limited to 'audio')
-rw-r--r-- | audio/format.c | 55 | ||||
-rw-r--r-- | audio/format.h | 136 |
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; |