diff options
Diffstat (limited to 'libfreerdp-rfx/rfx_quantization.c')
-rw-r--r-- | libfreerdp-rfx/rfx_quantization.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/libfreerdp-rfx/rfx_quantization.c b/libfreerdp-rfx/rfx_quantization.c index 9d67c0c..67755c0 100644 --- a/libfreerdp-rfx/rfx_quantization.c +++ b/libfreerdp-rfx/rfx_quantization.c @@ -19,17 +19,63 @@ #include "rfx_quantization.h" +static void +rfx_quantization_decode_block(sint16 * buffer, int buffer_size, uint32 factor) +{ + sint16 * dst; + + if (factor <= 6) + return; + + factor -= 6; + for (dst = buffer; buffer_size > 0; dst++, buffer_size--) + { + *dst <<= factor; + } +} + void -rfx_quantization_decode(uint32 * buffer, int buffer_size, uint32 factor) +rfx_quantization_decode(sint16 * buffer, const uint32 * quantization_values) +{ + rfx_quantization_decode_block(buffer, 1024, quantization_values[8]); /* HL1 */ + rfx_quantization_decode_block(buffer + 1024, 1024, quantization_values[7]); /* LH1 */ + rfx_quantization_decode_block(buffer + 2048, 1024, quantization_values[9]); /* HH1 */ + rfx_quantization_decode_block(buffer + 3072, 256, quantization_values[5]); /* HL2 */ + rfx_quantization_decode_block(buffer + 3328, 256, quantization_values[4]); /* LH2 */ + rfx_quantization_decode_block(buffer + 3584, 256, quantization_values[6]); /* HH2 */ + rfx_quantization_decode_block(buffer + 3840, 64, quantization_values[2]); /* HL3 */ + rfx_quantization_decode_block(buffer + 3904, 64, quantization_values[1]); /* LH3 */ + rfx_quantization_decode_block(buffer + 3868, 64, quantization_values[3]); /* HH3 */ + rfx_quantization_decode_block(buffer + 4032, 64, quantization_values[0]); /* LL3 */ +} + +static void +rfx_quantization_encode_block(sint16 * buffer, int buffer_size, uint32 factor) { - uint32 * dst; + sint16 * dst; if (factor <= 6) return; + factor -= 6; for (dst = buffer; buffer_size > 0; dst++, buffer_size--) { - *dst <<= (factor - 6); + *dst >>= factor; } } +void +rfx_quantization_encode(sint16 * buffer, const uint32 * quantization_values) +{ + rfx_quantization_encode_block(buffer, 1024, quantization_values[8]); /* HL1 */ + rfx_quantization_encode_block(buffer + 1024, 1024, quantization_values[7]); /* LH1 */ + rfx_quantization_encode_block(buffer + 2048, 1024, quantization_values[9]); /* HH1 */ + rfx_quantization_encode_block(buffer + 3072, 256, quantization_values[5]); /* HL2 */ + rfx_quantization_encode_block(buffer + 3328, 256, quantization_values[4]); /* LH2 */ + rfx_quantization_encode_block(buffer + 3584, 256, quantization_values[6]); /* HH2 */ + rfx_quantization_encode_block(buffer + 3840, 64, quantization_values[2]); /* HL3 */ + rfx_quantization_encode_block(buffer + 3904, 64, quantization_values[1]); /* LH3 */ + rfx_quantization_encode_block(buffer + 3868, 64, quantization_values[3]); /* HH3 */ + rfx_quantization_encode_block(buffer + 4032, 64, quantization_values[0]); /* LL3 */ +} + |