Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRDP/FreeRDP-old.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libfreerdp-rfx/rfx_quantization.c')
-rw-r--r--libfreerdp-rfx/rfx_quantization.c52
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 */
+}
+