Mercurial > audlegacy
diff src/libSAD/dither_ops.c @ 4240:29c8603a877a
added FMT_FIXED32, an equivalent of mad_fixed_t, already supported by libSAD; some endianness-related changes
| author | Eugene Zagidullin <e.asphyx@gmail.com> |
|---|---|
| date | Mon, 04 Feb 2008 01:30:53 +0300 |
| parents | 51291ce4eb54 |
| children | 63eb5966f105 |
line wrap: on
line diff
--- a/src/libSAD/dither_ops.c Sun Feb 03 19:02:04 2008 +0300 +++ b/src/libSAD/dither_ops.c Mon Feb 04 01:30:53 2008 +0300 @@ -303,15 +303,16 @@ ****************************************************************************************************************/ /*expand 24-bit signed value to 32-bit*/ -#define EXPAND_24_TO_32(x) (((int32_t)(((x) & 0x00ffffff) << 8)) >> 8) +#define EXPAND_S24_TO_32(x) (((int32_t)(((x) & 0x00ffffff) << 8)) >> 8) +#define EXPAND_U24_TO_32(x) ((int32_t)(x) & 0x00ffffff) /* signed */ static int32_t get_s24_i_sample (void *buf, int nch, int ch, int i) { - return (int32_t)EXPAND_24_TO_32(((int32_t*)buf)[i*nch+ch]); + return (int32_t)EXPAND_S24_TO_32(((int32_t*)buf)[i*nch+ch]); } static int32_t get_s24_s_sample (void *buf, int nch, int ch, int i) { - return (int32_t)EXPAND_24_TO_32(((int32_t**)buf)[ch][i]); + return (int32_t)EXPAND_S24_TO_32(((int32_t**)buf)[ch][i]); } static void put_s24_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { @@ -326,12 +327,12 @@ static int32_t get_s24_le_i_sample (void *buf, int nch, int ch, int i) { int32_t *tmp = (int32_t*)buf+i*nch+ch; - return (int32_t)EXPAND_24_TO_32(SAD_GET_LE32(tmp)); + return (int32_t)EXPAND_S24_TO_32(SAD_GET_LE32(tmp)); } static int32_t get_s24_le_s_sample (void *buf, int nch, int ch, int i) { int32_t *tmp = ((int32_t**)buf)[ch]+i; - return (int32_t)EXPAND_24_TO_32(SAD_GET_LE32(tmp)); + return (int32_t)EXPAND_S24_TO_32(SAD_GET_LE32(tmp)); } static void put_s24_le_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { @@ -348,12 +349,12 @@ static int32_t get_s24_be_i_sample (void *buf, int nch, int ch, int i) { int32_t *tmp = (int32_t*)buf+i*nch+ch; - return (int32_t)EXPAND_24_TO_32(SAD_GET_BE32(tmp)); + return (int32_t)EXPAND_S24_TO_32(SAD_GET_BE32(tmp)); } static int32_t get_s24_be_s_sample (void *buf, int nch, int ch, int i) { int32_t *tmp = ((int32_t**)buf)[ch]+i; - return (int32_t)EXPAND_24_TO_32(SAD_GET_BE32(tmp)); + return (int32_t)EXPAND_S24_TO_32(SAD_GET_BE32(tmp)); } static void put_s24_be_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { @@ -368,11 +369,11 @@ /* unsigned */ static int32_t get_u24_i_sample (void *buf, int nch, int ch, int i) { - return (int32_t)EXPAND_24_TO_32(((uint32_t*)buf)[i*nch+ch]) - 8388608; + return (int32_t)EXPAND_U24_TO_32(((uint32_t*)buf)[i*nch+ch]) - 8388608; } static int32_t get_u24_s_sample (void *buf, int nch, int ch, int i) { - return (int32_t)EXPAND_24_TO_32(((uint32_t**)buf)[ch][i]) - 8388608; + return (int32_t)EXPAND_U24_TO_32(((uint32_t**)buf)[ch][i]) - 8388608; } static void put_u24_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { @@ -383,6 +384,51 @@ ((uint32_t**)buf)[ch][i] = ((uint32_t)sample + 8388608) & 0x00ffffff; } +/* LE unsigned */ + +static int32_t get_u24_le_i_sample (void *buf, int nch, int ch, int i) { + int32_t *tmp = (int32_t*)buf+i*nch+ch; + /*fprintf(stderr, "%d\n", (int32_t)EXPAND_U24_TO_32(SAD_GET_LE32(tmp)) - 8388608);*/ + return (int32_t)EXPAND_U24_TO_32(SAD_GET_LE32(tmp)) - 8388608; +} + +static int32_t get_u24_le_s_sample (void *buf, int nch, int ch, int i) { + int32_t *tmp = ((int32_t**)buf)[ch]+i; + return (int32_t)EXPAND_U24_TO_32(SAD_GET_LE32(tmp)) - 8388608; +} + +static void put_u24_le_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { + int32_t *tmp = (int32_t*)buf+i*nch+ch; + SAD_PUT_LE32(tmp, (uint32_t)(sample + 8388608) & 0x00ffffff); +} + +static void put_u24_le_s_sample (void *buf, int32_t sample, int nch, int ch, int i) { + int32_t *tmp = ((int32_t**)buf)[ch]+i; + SAD_PUT_LE32(tmp, (uint32_t)(sample + 8388608) & 0x00ffffff); +} + +/* BE unsigned */ + +static int32_t get_u24_be_i_sample (void *buf, int nch, int ch, int i) { + int32_t *tmp = (int32_t*)buf+i*nch+ch; + return (int32_t)EXPAND_U24_TO_32(SAD_GET_BE32(tmp)) - 8388608; +} + +static int32_t get_u24_be_s_sample (void *buf, int nch, int ch, int i) { + int32_t *tmp = ((int32_t**)buf)[ch]+i; + return (int32_t)EXPAND_U24_TO_32(SAD_GET_BE32(tmp)) - 8388608; +} + +static void put_u24_be_i_sample (void *buf, int32_t sample, int nch, int ch, int i) { + int32_t *tmp = (int32_t*)buf+i*nch+ch; + SAD_PUT_BE32(tmp, (uint32_t)(sample + 8388608) & 0x00ffffff); +} + +static void put_u24_be_s_sample (void *buf, int32_t sample, int nch, int ch, int i) { + int32_t *tmp = ((int32_t**)buf)[ch]+i; + SAD_PUT_BE32(tmp, (uint32_t)(sample + 8388608) & 0x00ffffff); +} + static SAD_buffer_ops buf_s24_i_ops = { &get_s24_i_sample, &put_s24_i_sample @@ -423,6 +469,26 @@ &put_u24_s_sample }; +static SAD_buffer_ops buf_u24_le_i_ops = { + &get_u24_le_i_sample, + &put_u24_le_i_sample +}; + +static SAD_buffer_ops buf_u24_le_s_ops = { + &get_u24_le_s_sample, + &put_u24_le_s_sample +}; + +static SAD_buffer_ops buf_u24_be_i_ops = { + &get_u24_be_i_sample, + &put_u24_be_i_sample +}; + +static SAD_buffer_ops buf_u24_be_s_ops = { + &get_u24_be_s_sample, + &put_u24_be_s_sample +}; + /**************************************************************************************************************** * 32-bit * ****************************************************************************************************************/ @@ -496,8 +562,8 @@ {&buf_s24_le_i_ops, &buf_s24_le_s_ops}, /* SAD_SAMPLE_S24_LE */ {&buf_s24_be_i_ops, &buf_s24_be_s_ops}, /* SAD_SAMPLE_S24_BE */ {&buf_u24_i_ops, &buf_u24_s_ops}, /* SAD_SAMPLE_U24 */ - {NULL, NULL}, /* SAD_SAMPLE_U24_LE */ - {NULL, NULL}, /* SAD_SAMPLE_U24_BE */ + {&buf_u24_le_i_ops, &buf_u24_le_s_ops}, /* SAD_SAMPLE_U24_LE */ + {&buf_u24_be_i_ops, &buf_u24_be_s_ops}, /* SAD_SAMPLE_U24_BE */ {&buf_s32_i_ops, &buf_s32_s_ops}, /* SAD_SAMPLE_S32 */ {NULL, NULL}, /* SAD_SAMPLE_S32_LE */
