FreeRDP
Loading...
Searching...
No Matches
rfx_differential.h
1
20#ifndef FREERDP_LIB_CODEC_RFX_DIFFERENTIAL_H
21#define FREERDP_LIB_CODEC_RFX_DIFFERENTIAL_H
22
23#include <freerdp/codec/rfx.h>
24#include <freerdp/api.h>
25#include "rfx_types.h"
26
27WINPR_ATTR_NODISCARD
28static inline BOOL rfx_differential_decode(INT16* WINPR_RESTRICT buffer, size_t size)
29{
30 INT16* ptr = buffer;
31 INT16* end = &buffer[size - 1];
32
33 while (ptr != end)
34 {
35 const int tmp = ptr[0] + ptr[1];
36 if ((tmp > INT16_MAX) || (tmp < INT16_MIN))
37 {
38 WLog_ERR(RFX_TAG, "differental: %d <= %d <= %d\n", INT16_MIN, tmp, INT16_MAX);
39 return FALSE;
40 }
41 ptr[1] = WINPR_ASSERTING_INT_CAST(INT16, tmp);
42 ptr++;
43 }
44 return TRUE;
45}
46
47static inline void rfx_differential_encode(INT16* WINPR_RESTRICT buffer, size_t size)
48{
49 INT16 n1 = buffer[0];
50 for (size_t x = 0; x < size - 1; x++)
51 {
52 INT16* dst = &buffer[x + 1];
53 const INT16 n2 = *dst;
54 const int tmp = n2 - n1;
55 *dst = WINPR_ASSERTING_INT_CAST(INT16, tmp);
56 n1 = n2;
57 }
58}
59
60#endif /* FREERDP_LIB_CODEC_RFX_DIFFERENTIAL_H */